2013-12-08 44 views
1

我已经使用了numpy.array_split()函数来将一列天文数据分成一系列已知长度的子阵列(子阵列的数量完全未知和任意)。我想这些阵列顺序彼此相加,使一个数组几个子阵:如何将numpy子阵列添加到对方?

A = [[1, 2, 3, 4] 
    [5, 6, 7, 8] 
    [9, 10, 11]] 

可能成为这一个:

B = [15, 18, 21, NaN] 

我在想,这可能是可以做到的如B = numpy.sum(A[1], A[2], A[3], axis=0),然后执行我可能喜欢的任何操作。但是,由于子阵列的数量是任意的,所以除非我知道子阵列的数量,否则此方法将不起作用。

任何帮助解决这个问题,将不胜感激。

+0

这'A'不可能是 “一个数组几个子阵”。它是什么?列表清单?数组列表?由于某种原因,您已将多个阵列呈现为一个阵列? – user2357112

回答

2

我可能只是垫A的最后一个成员:

>>> a = np.arange(1,12) 
>>> A = np.array_split(a,3) 
>>> A 
[array([1, 2, 3, 4]), array([5, 6, 7, 8]), array([ 9, 10, 11])] 
>>> A[-1] = np.append(A[-1], [np.nan]*(len(A[-2])-len(A[-1]))) 
>>> A 
[array([1, 2, 3, 4]), array([5, 6, 7, 8]), array([ 9., 10., 11., nan])] 
>>> np.sum(A,axis=0) 
array([ 15., 18., 21., nan]) 

但是诚实的说,我想你会好起来的填充,然后重塑,让你仍然有numpy工作数组而不是数组列表。 numpy的确不是用于处理一系列不同长度的数据,它不能像pandas那样方便地处理丢失的数据。

1

我认为解决这个问题的最好方法是首先填充,然后拆分。如果先分割,则必须根据分割的方式重新填充多个元素。例如,将np.arange(1, 11)拆分为3会得到两行长度不足的行。

如果你正在做算术,可能用填充零比用NaN填充更自然,但我不知道你的应用程序,所以我们可以做到这一点。填充用零:

a = np.arange(1, 11) 
b = 3 
pad_length = (b - len(a) % b) % b 
a0 = np.pad(a, (0, pad_length), mode='constant') 
A0 = np.array_split(a0) 
np.sum(A0, axis=0) # array([15, 18, 10, 12]) 

填充与南:

aN = np.append(a, [np.nan] * pad_length) 
AN = np.array_split(aN)