@@ -1357,41 +1357,42 @@ def group_min_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1357
1357
1358
1358
N, K = (<object> values).shape
1359
1359
1360
- b = 0
1361
- if K > 1:
1362
- for i in range(N):
1363
- while b < ngroups - 1 and i >= bins[b]:
1364
- b += 1
1360
+ with nogil:
1361
+ b = 0
1362
+ if K > 1:
1363
+ for i in range(N):
1364
+ while b < ngroups - 1 and i >= bins[b]:
1365
+ b += 1
1365
1366
1366
- counts[b] += 1
1367
- for j in range(K):
1368
- val = values[i, j]
1367
+ counts[b] += 1
1368
+ for j in range(K):
1369
+ val = values[i, j]
1369
1370
1370
- # not nan
1371
- if val == val:
1372
- nobs[b, j] += 1
1373
- if val < minx[b, j]:
1374
- minx[b, j] = val
1375
- else:
1376
- for i in range(N):
1377
- while b < ngroups - 1 and i >= bins[b]:
1378
- b += 1
1371
+ # not nan
1372
+ if val == val:
1373
+ nobs[b, j] += 1
1374
+ if val < minx[b, j]:
1375
+ minx[b, j] = val
1376
+ else:
1377
+ for i in range(N):
1378
+ while b < ngroups - 1 and i >= bins[b]:
1379
+ b += 1
1379
1380
1380
- counts[b] += 1
1381
- val = values[i, 0]
1381
+ counts[b] += 1
1382
+ val = values[i, 0]
1382
1383
1383
- # not nan
1384
- if val == val:
1385
- nobs[b, 0] += 1
1386
- if val < minx[b, 0]:
1387
- minx[b, 0] = val
1384
+ # not nan
1385
+ if val == val:
1386
+ nobs[b, 0] += 1
1387
+ if val < minx[b, 0]:
1388
+ minx[b, 0] = val
1388
1389
1389
- for i in range(ngroups):
1390
- for j in range(K):
1391
- if nobs[i, j] == 0:
1392
- out[i, j] = %(nan_val)s
1393
- else:
1394
- out[i, j] = minx[i, j]
1390
+ for i in range(ngroups):
1391
+ for j in range(K):
1392
+ if nobs[i, j] == 0:
1393
+ out[i, j] = %(nan_val)s
1394
+ else:
1395
+ out[i, j] = minx[i, j]
1395
1396
"""
1396
1397
1397
1398
group_max_template = """@cython.wraparound(False)
@@ -1404,7 +1405,7 @@ def group_max_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1404
1405
Only aggregates on axis=0
1405
1406
'''
1406
1407
cdef:
1407
- Py_ssize_t i, j, N, K, lab
1408
+ Py_ssize_t i, j, N, K, lab, ncounts = len(counts)
1408
1409
%(dest_type2)s val, count
1409
1410
ndarray[%(dest_type2)s, ndim=2] maxx, nobs
1410
1411
@@ -1418,42 +1419,43 @@ def group_max_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1418
1419
1419
1420
N, K = (<object> values).shape
1420
1421
1421
- if K > 1:
1422
- for i in range(N):
1423
- lab = labels[i]
1424
- if lab < 0:
1425
- continue
1422
+ with nogil:
1423
+ if K > 1:
1424
+ for i in range(N):
1425
+ lab = labels[i]
1426
+ if lab < 0:
1427
+ continue
1426
1428
1427
- counts[lab] += 1
1428
- for j in range(K):
1429
- val = values[i, j]
1429
+ counts[lab] += 1
1430
+ for j in range(K):
1431
+ val = values[i, j]
1430
1432
1431
- # not nan
1432
- if val == val:
1433
- nobs[lab, j] += 1
1434
- if val > maxx[lab, j]:
1435
- maxx[lab, j] = val
1436
- else:
1437
- for i in range(N):
1438
- lab = labels[i]
1439
- if lab < 0:
1440
- continue
1433
+ # not nan
1434
+ if val == val:
1435
+ nobs[lab, j] += 1
1436
+ if val > maxx[lab, j]:
1437
+ maxx[lab, j] = val
1438
+ else:
1439
+ for i in range(N):
1440
+ lab = labels[i]
1441
+ if lab < 0:
1442
+ continue
1441
1443
1442
- counts[lab] += 1
1443
- val = values[i, 0]
1444
+ counts[lab] += 1
1445
+ val = values[i, 0]
1444
1446
1445
- # not nan
1446
- if val == val:
1447
- nobs[lab, 0] += 1
1448
- if val > maxx[lab, 0]:
1449
- maxx[lab, 0] = val
1447
+ # not nan
1448
+ if val == val:
1449
+ nobs[lab, 0] += 1
1450
+ if val > maxx[lab, 0]:
1451
+ maxx[lab, 0] = val
1450
1452
1451
- for i in range(len(counts) ):
1452
- for j in range(K):
1453
- if nobs[i, j] == 0:
1454
- out[i, j] = %(nan_val)s
1455
- else:
1456
- out[i, j] = maxx[i, j]
1453
+ for i in range(ncounts ):
1454
+ for j in range(K):
1455
+ if nobs[i, j] == 0:
1456
+ out[i, j] = %(nan_val)s
1457
+ else:
1458
+ out[i, j] = maxx[i, j]
1457
1459
"""
1458
1460
1459
1461
group_max_bin_template = """@cython.wraparound(False)
@@ -1481,41 +1483,42 @@ def group_max_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1481
1483
1482
1484
N, K = (<object> values).shape
1483
1485
1484
- b = 0
1485
- if K > 1:
1486
- for i in range(N):
1487
- while b < ngroups - 1 and i >= bins[b]:
1488
- b += 1
1486
+ with nogil:
1487
+ b = 0
1488
+ if K > 1:
1489
+ for i in range(N):
1490
+ while b < ngroups - 1 and i >= bins[b]:
1491
+ b += 1
1489
1492
1490
- counts[b] += 1
1491
- for j in range(K):
1492
- val = values[i, j]
1493
+ counts[b] += 1
1494
+ for j in range(K):
1495
+ val = values[i, j]
1493
1496
1494
- # not nan
1495
- if val == val:
1496
- nobs[b, j] += 1
1497
- if val > maxx[b, j]:
1498
- maxx[b, j] = val
1499
- else:
1500
- for i in range(N):
1501
- while b < ngroups - 1 and i >= bins[b]:
1502
- b += 1
1497
+ # not nan
1498
+ if val == val:
1499
+ nobs[b, j] += 1
1500
+ if val > maxx[b, j]:
1501
+ maxx[b, j] = val
1502
+ else:
1503
+ for i in range(N):
1504
+ while b < ngroups - 1 and i >= bins[b]:
1505
+ b += 1
1503
1506
1504
- counts[b] += 1
1505
- val = values[i, 0]
1507
+ counts[b] += 1
1508
+ val = values[i, 0]
1506
1509
1507
- # not nan
1508
- if val == val:
1509
- nobs[b, 0] += 1
1510
- if val > maxx[b, 0]:
1511
- maxx[b, 0] = val
1510
+ # not nan
1511
+ if val == val:
1512
+ nobs[b, 0] += 1
1513
+ if val > maxx[b, 0]:
1514
+ maxx[b, 0] = val
1512
1515
1513
- for i in range(ngroups):
1514
- for j in range(K):
1515
- if nobs[i, j] == 0:
1516
- out[i, j] = %(nan_val)s
1517
- else:
1518
- out[i, j] = maxx[i, j]
1516
+ for i in range(ngroups):
1517
+ for j in range(K):
1518
+ if nobs[i, j] == 0:
1519
+ out[i, j] = %(nan_val)s
1520
+ else:
1521
+ out[i, j] = maxx[i, j]
1519
1522
"""
1520
1523
1521
1524
@@ -1529,7 +1532,7 @@ def group_min_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1529
1532
Only aggregates on axis=0
1530
1533
'''
1531
1534
cdef:
1532
- Py_ssize_t i, j, N, K, lab
1535
+ Py_ssize_t i, j, N, K, lab, ncounts = len(counts)
1533
1536
%(dest_type2)s val, count
1534
1537
ndarray[%(dest_type2)s, ndim=2] minx, nobs
1535
1538
@@ -1543,42 +1546,43 @@ def group_min_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1543
1546
1544
1547
N, K = (<object> values).shape
1545
1548
1546
- if K > 1:
1547
- for i in range(N):
1548
- lab = labels[i]
1549
- if lab < 0:
1550
- continue
1549
+ with nogil:
1550
+ if K > 1:
1551
+ for i in range(N):
1552
+ lab = labels[i]
1553
+ if lab < 0:
1554
+ continue
1551
1555
1552
- counts[lab] += 1
1553
- for j in range(K):
1554
- val = values[i, j]
1556
+ counts[lab] += 1
1557
+ for j in range(K):
1558
+ val = values[i, j]
1555
1559
1556
- # not nan
1557
- if val == val:
1558
- nobs[lab, j] += 1
1559
- if val < minx[lab, j]:
1560
- minx[lab, j] = val
1561
- else:
1562
- for i in range(N):
1563
- lab = labels[i]
1564
- if lab < 0:
1565
- continue
1560
+ # not nan
1561
+ if val == val:
1562
+ nobs[lab, j] += 1
1563
+ if val < minx[lab, j]:
1564
+ minx[lab, j] = val
1565
+ else:
1566
+ for i in range(N):
1567
+ lab = labels[i]
1568
+ if lab < 0:
1569
+ continue
1566
1570
1567
- counts[lab] += 1
1568
- val = values[i, 0]
1571
+ counts[lab] += 1
1572
+ val = values[i, 0]
1569
1573
1570
- # not nan
1571
- if val == val:
1572
- nobs[lab, 0] += 1
1573
- if val < minx[lab, 0]:
1574
- minx[lab, 0] = val
1574
+ # not nan
1575
+ if val == val:
1576
+ nobs[lab, 0] += 1
1577
+ if val < minx[lab, 0]:
1578
+ minx[lab, 0] = val
1575
1579
1576
- for i in range(len(counts) ):
1577
- for j in range(K):
1578
- if nobs[i, j] == 0:
1579
- out[i, j] = %(nan_val)s
1580
- else:
1581
- out[i, j] = minx[i, j]
1580
+ for i in range(ncounts ):
1581
+ for j in range(K):
1582
+ if nobs[i, j] == 0:
1583
+ out[i, j] = %(nan_val)s
1584
+ else:
1585
+ out[i, j] = minx[i, j]
1582
1586
"""
1583
1587
1584
1588
0 commit comments