繁体   English   中英

合并numpy数组列表并重塑

[英]Combine list of numpy arrays and reshape

我希望任何人都可以在以下方面为我提供帮助。 我有2个数组列表,应该互相链接。 每个列表代表一个特定的对象。 arr1arr2是该对象的属性。 例如:

import numpy as np

arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])]
arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])]

数组彼此链接,如arr1中的1 ,第一个数组属于arr220第一个数组。 我在此示例中寻找的结果将是大小为3,4的numpy数组。 “列”代表0、1、2、3(arr1中的数字加0),并且行中填充了对应的arr2值。 如果没有相应的值,则该单元格应为0。示例:

array([[ 0, 20, 50, 30],
       [ 0, 50, 50,  0],
       [ 0,  0, 75, 25]])

我将如何链接这两个数组列表,并按照所需的格式对它们进行整形,如上面的示例所示?

非常感谢!

这是几乎*向量化的方法-

lens = np.array([len(i) for i in arr1])

N = len(arr1)
row_idx = np.repeat(np.arange(N),lens)
col_idx = np.concatenate(arr1)

M = col_idx.max()+1
out = np.zeros((N,M),dtype=int)
out[row_idx,col_idx] = np.concatenate(arr2)

*:几乎是因为一开始就对循环有所了解,但这在计算上可以忽略不计,因为它在那里不涉及任何计算。

这是带有for循环的解决方案。 详细显示每个步骤。

import numpy as np

arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])]
arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])]

maxi = []
for i in range(len(arr1)):
    maxi.append(np.max(arr1[i]))
maxi = np.max(maxi)
output = np.zeros((len(arr2),maxi))
for i in range(len(arr1)):
    for k in range(len(arr1[i])):
        output[i][k]=arr2[i][k]

这是一种简单的方法,仅具有一个迭代级别:

In [261]: res=np.zeros((3,4),int)
In [262]: for i,(idx,vals) in enumerate(zip(arr1, arr2)):
     ...:     res[i,idx]=vals
     ...:     
In [263]: res
Out[263]: 
array([[ 0, 20, 50, 30],
       [ 0, 50, 50,  0],
       [ 0,  0, 75, 25]])

我怀疑此示例比@Divakar's方法更快。 只要列数比行数大很多,它就应该保持竞争力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM