我使用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执行我可能喜欢的任何操作。但是,由于子数组的数量是任意的,所以除非我这个方法不起作用知道子阵列的数量。
任何帮助解决这个问题都将不胜感激。
答案 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)