Mah*_*hdi 3 python arrays numpy scipy
我有一个整数的numpy数组x(有(n,4)形状),如:
[[0 1 2 3],
[1 2 7 9],
[2 1 5 2],
...]
Run Code Online (Sandbox Code Playgroud)
我想将数组转换为一对数组:
[0,1]
[0,2]
[0,3]
[1,2]
...
Run Code Online (Sandbox Code Playgroud)
所以第一个元素与同一个子数组中的其他元素成对.我已经有了一个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)
Run Code Online (Sandbox Code Playgroud)
但由于在numpy数组上循环效率不高,我尝试slicing了解决方案.我可以为每列进行切片:
y[1]=np.array([x[:,0],x[:,1]]).T
# [[0,1],[1,2],[2,1],...]
Run Code Online (Sandbox Code Playgroud)
我可以为所有列重复此操作.我的问题是:
y[2]到y[1]...使得形状是(N,2)?4),我怎样才能找到y[i]优雅的?我能想到的最干净的方法是:
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
这将产生两份数据,因此它不是最有效的方法.这可能是这样的:
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2991 次 |
| 最近记录: |