你如何互相添加numpy子阵列?

时间:2013-12-08 02:41:15

标签: python arrays numpy

我使用numpy.array_split()函数将一组天文数据拆分成一系列已知长度的子阵列(子阵列的数量是完全未知和任意的)。我想按顺序将这些数组相互添加,以便一个数组包含多个子数组:

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)这样的事情,然后用B执行我可能喜欢的任何操作。但是,由于子数组的数量是任意的,所以除非我这个方法不起作用知道子阵列的数量。

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

2 个答案:

答案 0 :(得分: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 :(得分: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])

用NaN填充:

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