Python 在一个numpy数组中以1024为一组填写数字

Python 在一个numpy数组中以1024为一组填写数字,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我有一个大的numpy数组,其元素如下所示 A = [512,2560,3584,5632,....] A2 = [512,513,514,...,1535,2560,2561,2562,...3583,....] 元素的间距始终至少为1024 假设我需要将上面的数组转换为下面的数组,其中对于原始矩阵A的每个元素,我取一个从A[n]到A[n]+1024(一步一步)的值范围,这些值成为新矩阵的值,如下所示 A = [512,2560,3584,5632,....] A2 = [512,513

我有一个大的numpy数组,其元素如下所示

A = [512,2560,3584,5632,....]
A2 = [512,513,514,...,1535,2560,2561,2562,...3583,....]
元素的间距始终至少为1024

假设我需要将上面的数组转换为下面的数组,其中对于原始矩阵A的每个元素,我取一个从
A[n]
A[n]+1024
(一步一步)的值范围,这些值成为新矩阵的值,如下所示

A = [512,2560,3584,5632,....]
A2 = [512,513,514,...,1535,2560,2561,2562,...3583,....]
我设置问题的方法是循环原始矩阵A,生成介于
A[0]
A[0]+1024
之间的一系列值(例如),将它们分配到一个新数组,等等。代码如下。约定将A作为原始种子矩阵

seed = 0
A2 = np.empty(len(A)*1024,)
for ind in range(len(A)):
    A2[seed:seed+1024] = np.arange(A[ind],A[ind]+1024)
    seed = seed+1024;
我得到了我需要的答案,但我想知道这是否是最好的方法。我是一名matlab用户,正在使用python和
numpy
,我还不习惯优化
numpy
。谢谢你的帮助

您可以使用-

样本运行-

# Input array
In [433]: A = np.array([512,2560,3584,5632])

# Add ranged numbers in a broadcasted way for elementwise addition   
In [434]: A[:,None] + np.arange(1024)
Out[434]: 
array([[ 512,  513,  514, ..., 1533, 1534, 1535],
       [2560, 2561, 2562, ..., 3581, 3582, 3583],
       [3584, 3585, 3586, ..., 4605, 4606, 4607],
       [5632, 5633, 5634, ..., 6653, 6654, 6655]])

# Finally flatten those for final output
In [435]: (A[:,None] + np.arange(1024)).ravel()
Out[435]: array([ 512,  513,  514, ..., 6653, 6654, 6655])
交替地-


等效MATLAB版本:

作为参考,MATLAB版本利用与
bsxfun
等效的
broadcasting
,并记住列的主要顺序,将沿着以下几行进行查看-

>> A = [512,2560,3584,5632];
>> sums = bsxfun(@plus, A, [0:1023].');
>> [sums(1:3,1) ; sums(end-2:end,1)].'
ans =
         512         513         514        1533        1534        1535
>> [sums(1:3,2) ; sums(end-2:end,2)].'
ans =
        2560        2561        2562        3581        3582        3583
>> [sums(1:3,3) ; sums(end-2:end,3)].'
ans =
        3584        3585        3586        4605        4606        4607
>> [sums(1:3,4) ; sums(end-2:end,4)].'
ans =
        5632        5633        5634        6653        6654        6655
>> out = reshape(sums,1,[]);
>> [out(1:3) out(end-2:end)]
ans =
         512         513         514        6653        6654        6655
您可以使用:

(A.reshape(-1,1) + numpy.arange(1024)).reshape(-1)
这项工作如下:

  • 首先,我们使用
    整形(-1,1)
    获得n×1阵列
  • 接下来,我们使用广播向每行添加0到1024;及
  • 然后我们将其重塑为一维阵列

  • 非常感谢。这太好了。@ TurngsMault如果这对你有用的话,考虑接受它。更多信息-