NumPy中用于矢量化的引用索引



我有几个for循环,为了提高性能,我想对它们进行矢量化。它们对1 x N个矩阵进行运算。

for y in range(1, len(array[0]) + 1):
array[0, y - 1] =  np.floor(np.nanmean(otherArray[0, ((y-1)*3):((y-1)*3+3)]))
for i in range(len(array[0])):
array[0, int((i-1)*L+1)] = otherArray[0, i]

操作依赖于for循环给出的数组索引。有没有什么方法可以在使用numpy.vectorize时访问索引,这样我就可以将它们重写为矢量化函数?

第一个循环:

import numpy as np
array = np.zeros((1, 10))
otherArray = np.arange(30).reshape(1, -1)

print(f'array = n{array}')
print(f'otherArray = n{otherArray}')
for y in range(1, len(array[0]) + 1):
array[0, y - 1] =  np.floor(np.nanmean(otherArray[0, ((y-1)*3):((y-1)*3+3)]))
print(f'array = n{array}')
array = np.floor(np.nanmean(otherArray.reshape(-1, 3), axis = 1)).reshape(1, -1)
print(f'array = n{array}')

输出:

array = 
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
otherArray = 
[[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29]]
array = 
[[ 1.  4.  7. 10. 13. 16. 19. 22. 25. 28.]]
array = 
[[ 1.  4.  7. 10. 13. 16. 19. 22. 25. 28.]]

第二个循环:

array = np.zeros((1, 10))
otherArray = np.arange(10, dtype = float).reshape(1, -1)
L = 1
print(f'array = n{array}')
print(f'otherArray = n{otherArray}')

for i in range(len(otherArray[0])):
array[0, int((i-1)*L+1)] = otherArray[0, i]
print(f'array = n{array}')

array = otherArray
print(f'array = n{array}')

输出:

array = 
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
otherArray = 
[[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]]
array = 
[[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]]
array = 
[[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]]

在第一个循环中,您似乎正在尝试计算移动平均值。最好这样做:

import numpy as np

window_width = 3
arr = np.arange(12)
out = np.floor(np.nanmean(arr.reshape(-1,window_width) ,axis=-1))
print(out)

关于你的第二个循环,我不知道它是干什么的。您正试图将值从其他数组复制到具有一定偏移量的数组?我建议您查看numpy的切片功能。

最新更新