Python Numpy:展平二维数组的某些列
假设我有一个numpy数组,如下所示Python Numpy:展平二维数组的某些列,python,numpy,Python,Numpy,假设我有一个numpy数组,如下所示 a = np.asarray([[1,2,3],[1,4,3],[2,5,4],[2,7,5]]) array([[1, 2, 3], [1, 4, 3], [2, 5, 4], [2, 7, 5]]) 如何为第1列中的每个唯一元素展平第2列和第3列,如下所示: array([[1, 2, 3, 4, 3], [2, 5, 4, 7, 5],]) 谢谢你的帮助 import numpy as np
a = np.asarray([[1,2,3],[1,4,3],[2,5,4],[2,7,5]])
array([[1, 2, 3],
[1, 4, 3],
[2, 5, 4],
[2, 7, 5]])
如何为第1列中的每个唯一元素展平第2列和第3列,如下所示:
array([[1, 2, 3, 4, 3],
[2, 5, 4, 7, 5],])
谢谢你的帮助
import numpy as np
a = np.asarray([[1,2,3],[1,4,3],[2,5,4],[2,7,5]])
d = {}
for row in a:
d[row[0]] = np.concatenate( (d.get(row[0], []), row[1:]) )
r = np.array([np.concatenate(([key], d[key])) for key in d])
print(r)
这张照片是:
[[ 1. 2. 3. 4. 3.]
[ 2. 5. 4. 7. 5.]]
使用列表理解的另一个选项:
np.array([np.insert(a[a[:,0] == k, 1:].flatten(), 0, k) for k in np.unique(a[:,0])])
# array([[1, 2, 3, 4, 3],
# [2, 5, 4, 7, 5]])
因为正如在评论中所发布的,我们知道
列-0
中的每个唯一元素都有固定数量的行,我认为这意味着相同数量的行,所以我们可以使用矢量化方法来解决这个问题。我们根据column-0
对行进行排序,并查找沿着它的移动,这将表示组更改,从而为我们提供column-0
中每个唯一元素关联的行的确切数量。让我们称之为L
。最后,我们对排序后的数组进行切片以选择列-1,2
,并通过重塑将L
行分组在一起。因此,执行工作将是非常重要的-
sa = a[a[:,0].argsort()]
L = np.unique(sa[:,0],return_index=True)[1][1]
out = np.column_stack((sa[::L,0],sa[:,1:].reshape(-1,2*L)))
为了提高性能,我们可以使用np.diff
来计算L
,如下所示-
L = np.where(np.diff(sa[:,0])>0)[0][0]+1
样本运行-
In [103]: a
Out[103]:
array([[1, 2, 3],
[3, 7, 8],
[1, 4, 3],
[2, 5, 4],
[3, 8, 2],
[2, 7, 5]])
In [104]: sa = a[a[:,0].argsort()]
...: L = np.unique(sa[:,0],return_index=True)[1][1]
...: out = np.column_stack((sa[::L,0],sa[:,1:].reshape(-1,2*L)))
...:
In [105]: out
Out[105]:
array([[1, 2, 3, 4, 3],
[2, 5, 4, 7, 5],
[3, 7, 8, 8, 2]])
如果结果行的长度不相同,会发生什么情况?列1中的每个唯一元素都有固定数量的行,因此结果行的长度相同。我怀疑numpy在这种特定情况下是否具有内置函数。不过你可以用熊猫。或者只编写自己的函数。你试过什么吗?