我有数千个元素的多个数组。我需要打开所有这些并使用多个条件创建输出数组。 使用此问题(Iterating over a numpy array)中的说明,我设法创建了一个解决方案,但它在我的大型阵列上运行速度非常慢。
代码就是这样,在只有两个数组的测试样本上运行(我可以有两个以上):
import numpy as np
from random import randint
import random
def declare_arrays():
random.seed(1)
w, h = 10, 10
mat1 = np.array([[randint(0, 100) for x in range(w)] for y in range(h)])
print (mat1, type(mat1))
random.seed(2)
mat2 = np.array([[randint(0, 100) for i in range(w)] for j in range(h)])
print (mat2, type(mat2))
return mat1, mat2
if __name__=="__main__":
arr1, arr2 = declare_arrays()
arr_out = np.zeros(arr1.shape)
for (i, j), val1 in np.ndenumerate(arr1):
val2 = arr2[i, j]
if (val1 > val2) and (val2 > 5):
arr_out[i, j] = val2
else:
arr_out[i, j] = val1
print("Arr out: ", arr_out)
这给出了结果:
Arr out:
[[ 7. 11. 10. 8. 21. 15. 63. 39. 32. 60.]
[ 27. 48. 100. 26. 12. 20. 3. 49. 50. 77.]
[ 65. 47. 0. 56. 57. 34. 92. 29. 46. 13.]
[ 40. 3. 2. 3. 21. 69. 1. 30. 29. 27.]
[ 22. 41. 3. 17. 28. 65. 46. 63. 70. 29.]
[ 23. 29. 53. 28. 67. 58. 37. 2. 45. 46.]
[ 57. 12. 23. 51. 91. 37. 15. 83. 42. 31.]
[ 62. 35. 54. 64. 65. 24. 38. 36. 59. 44.]
[ 64. 50. 71. 4. 58. 31. 84. 28. 41. 85.]
[ 21. 46. 34. 89. 61. 39. 38. 47. 11. 56.]]
但这是在10x10阵列上运行的。如果我在10000x10000阵列上运行它,则需要很长时间。有没有办法让这更快? 谢谢你的帮助!
答案 0 :(得分:2)
使用np.where
替换那些按元素操作 -
arr_out = np.where( (arr1 > arr2) & (arr2 > 5), arr2, arr1)