如果你想大幅提高代码的性能,可以采取以下措施:
消除循环;并且
避免删除操作(会导致原始数组的复制)
NumPy 1.7引入了一种比原来更易于使用的新掩码,其性能也要好得多,因为它是NumPy核心数组对象的一部分。我认为这对你有用,因为使用它可以避免昂贵的删除操作。
换句话说,不要删除你不想要的数组元素,而是将它们掩盖起来。这已经被建议在其他答案中,但我建议使用新掩码。
要使用NA,只需导入NA。
>>> from numpy import NA as NA
然后针对给定的数组,将maskna标志设置为True
>>> A.flags.maskna = True
另外,大多数数组构造函数(自1.7版本起)都有一个名为maskna的参数,您可以将其设置为True
>>> A[3,3] = NA
array([[7, 5, 4, 8, 4],
[2, 4, 3, 7, 3],
[3, 1, 3, 2, 1],
[8, 2, 0, NA, 7],
[0, 7, 2, 5, 5],
[5, 4, 2, 7, 4],
[1, 2, 9, 2, 3],
[7, 5, 1, 2, 9]])
>>> A.sum(axis=0)
array([33, 30, 24, NA, 36])
通常这并不是您想要的 - 即,您仍然希望将该列的总和视为0处理NA:
要获得该行为,请对skipma参数传入True(在NumPy 1.7中,大多数NumPy数组构造函数都具有此参数):
>>> A.sum(axis=0, skipna=True)
array([33, 30, 24, 33, 36])
总之,要加快代码的速度,消除循环并使用新的掩码:
>>> A[(A<=3)&(A<=6)] = NA
>>> A
array([[8, 8, 4, NA, NA],
[7, 9, NA, NA, 8],
[NA, 6, 9, 5, NA],
[9, 4, 6, 6, 5],
[NA, 6, 8, NA, NA],
[8, 5, 7, 7, NA],
[NA, 4, 5, 9, 9],
[NA, 8, NA, 5, 9]])
NA占位符在这个上下文中的行为类似于0,我认为这正是你想要的:
>>> A.sum(axis=0, skipna=True)
array([32, 50, 39, 32, 31])
x
和y
是否会发生变化? - JoshAdel