从大型 2D NumPy 数组中提取不同大小的子行
Extract sub rows with varying sizes from a big 2D NumPy Array
我有一个 NumPy 数组,大小为 3*10
,我想从每行中提取不同大小的子行。子行以不同像素大小的中间像素为中心。然后我取每个子行的平均数。我在下面有一个伪示例:
import numpy as np
arr = np.arange(1,31).reshape((3,10))
pixel_size = np.array([2,3,1])
## the subrow centers in the middle of the array, index 5
mask = [[5-2:5+2],[5-3:5+3],[5-1:5+1]] ## index for each row
### submatrix = arr[;,mask]
submatrix = [[3,4,5,6],[12,13,14,15,16,17],[24,25]]
## output = np.mean(submatrix, axis=1) output is the average number of each row in the submatrix
output = [4.5,14.5,24.5]
如果我有超过 1000 万行,我该如何快速处理这种情况。
您可以使用列表理解和索引切片来做到这一点:
import numpy as np
arr = np.arange(1,31).reshape((3,10))
pixel_size = np.array([2,3,1])
middle_ind = int(arr.shape[1]/2.)
print middle_ind
sub_arr = [arr[i,middle_ind - pixel_size[i]:middle_ind + pixel_size[i]] for i in range(len(pixel_size))]
print('sub_arr: ', sub_arr)
output = [np.mean(item) for item in sub_arr]
print('output: ', output)
> sub_arr: [array([4, 5, 6, 7]), array([13, 14, 15, 16, 17, 18]), array([25, 26])]
> output: [5.5, 15.5, 25.5]
您的子矩阵是列表而不是数组,因此向量化操作更加困难。您可能需要考虑重构代码以利用矩阵运算。
我有一个 NumPy 数组,大小为 3*10
,我想从每行中提取不同大小的子行。子行以不同像素大小的中间像素为中心。然后我取每个子行的平均数。我在下面有一个伪示例:
import numpy as np
arr = np.arange(1,31).reshape((3,10))
pixel_size = np.array([2,3,1])
## the subrow centers in the middle of the array, index 5
mask = [[5-2:5+2],[5-3:5+3],[5-1:5+1]] ## index for each row
### submatrix = arr[;,mask]
submatrix = [[3,4,5,6],[12,13,14,15,16,17],[24,25]]
## output = np.mean(submatrix, axis=1) output is the average number of each row in the submatrix
output = [4.5,14.5,24.5]
如果我有超过 1000 万行,我该如何快速处理这种情况。
您可以使用列表理解和索引切片来做到这一点:
import numpy as np
arr = np.arange(1,31).reshape((3,10))
pixel_size = np.array([2,3,1])
middle_ind = int(arr.shape[1]/2.)
print middle_ind
sub_arr = [arr[i,middle_ind - pixel_size[i]:middle_ind + pixel_size[i]] for i in range(len(pixel_size))]
print('sub_arr: ', sub_arr)
output = [np.mean(item) for item in sub_arr]
print('output: ', output)
> sub_arr: [array([4, 5, 6, 7]), array([13, 14, 15, 16, 17, 18]), array([25, 26])]
> output: [5.5, 15.5, 25.5]
您的子矩阵是列表而不是数组,因此向量化操作更加困难。您可能需要考虑重构代码以利用矩阵运算。