gpt4 book ai didi

python - 从 Numpy 中的数组创建对列表的有效方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:06 24 4
gpt4 key购买 nike

我有一个整数的 numpy 数组 x(具有 (n,4) 形状),例如:

[[0 1 2 3],
[1 2 7 9],
[2 1 5 2],
...]

我想将数组转换成对数组:

[0,1]
[0,2]
[0,3]
[1,2]
...

所以第一个元素与同一子数组中的其他元素配对。我已经有了一个 for-loop 解决方案:

y=np.array([[x[j,0],x[j,i]] for i in range(1,4) for j in range(0,n)],dtype=int)

但由于遍历 numpy 数组效率不高,我尝试了 slicing 作为解决方案。我可以对每一列进行切片:

y[1]=np.array([x[:,0],x[:,1]]).T
# [[0,1],[1,2],[2,1],...]

我可以对所有列重复此操作。我的问题是:

  1. 我如何将 y[2] 附加到 y[1],... 这样形状是 (N,2)?
  2. 如果列数不小(在本例中为 4),如何优雅地找到 y[i]
  3. 实现最终数组的替代方法有哪些?

最佳答案

我能想到的最简洁的方法是:

>>> x = np.arange(12).reshape(3, 4)
>>> x
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> n = x.shape[1] - 1
>>> y = np.repeat(x, (n,)+(1,)*n, axis=1)
>>> y
array([[ 0, 0, 0, 1, 2, 3],
[ 4, 4, 4, 5, 6, 7],
[ 8, 8, 8, 9, 10, 11]])
>>> y.reshape(-1, 2, n).transpose(0, 2, 1).reshape(-1, 2)
array([[ 0, 1],
[ 0, 2],
[ 0, 3],
[ 4, 5],
[ 4, 6],
[ 4, 7],
[ 8, 9],
[ 8, 10],
[ 8, 11]])

这将制作两个数据副本,因此这不是最有效的方法。那可能是这样的:

>>> y = np.empty((x.shape[0], n, 2), dtype=x.dtype)
>>> y[..., 0] = x[:, 0, None]
>>> y[..., 1] = x[:, 1:]
>>> y.shape = (-1, 2)
>>> y
array([[ 0, 1],
[ 0, 2],
[ 0, 3],
[ 4, 5],
[ 4, 6],
[ 4, 7],
[ 8, 9],
[ 8, 10],
[ 8, 11]])

关于python - 从 Numpy 中的数组创建对列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29585379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com