假设我有一个像下面这样的二维数组:
array([3, 6, 7
1,-1, 3])
我想获得 3 个单独的数组x
,y
和value
数组。换句话说:
x = [0, 1, 0, 1, 0, 1]
y = [0, 0, 1, 1, 2, 2]
values = [3, 1, 6, -1, 7, 3]
我怎样才能做到这一点?
作为参考,这就是 MATLAB 所说的线性索引。
How about something like:
x, y = np.indices(array.shape)
x = x.ravel(order='F')
y = y.ravel(order='F')
values = array.ravel(order='F')
如果你已经scipy
安装了numpy
,你可以使用它的sparse
模块
from scipy import sparse
x = np.array([[3,6,7],[1,-1,3]])
M=sparse.coo_matrix(x.T)
M.data
# array([ 3, 1, 6, -1, 7, 3])
M.col
# array([0, 1, 0, 1, 0, 1])
M.row
# array([0, 0, 1, 1, 2, 2])
看着coo_matrix
我看到它nonzero()
用于获取索引:
row,col = x.T.nonzero()
data = x.T[row,col]
如果 中可能有零x
,您将使用类似的解决方法np.nonzero(np.ones(x.T.shape))
。
def xyval(A):
x, y = np.indices(A.shape)
return x.ravel(), y.ravel(), A.ravel()
那这个呢:
import numpy as np
a = np.array([[3, 6, 7],
[1,-1, 3]])
n_rows, n_cols = a.shape
temp_x = np.repeat(np.arange(n_rows)[np.newaxis, :], n_cols, axis=0)
# construction of x can probably be simplified
x = temp_x.ravel()
y = np.repeat(np.arange(n_cols), n_rows)
values = a.ravel(order='F')
结果:
>>> x
array([0, 1, 0, 1, 0, 1])
>>> y
array([0, 0, 1, 1, 2, 2])
>>> values
array([ 3, 1, 6, -1, 7, 3])
您的values
数组可以通过使用flatten
二维数组(矩阵)的方法来获得。然后只需构造x
andy
数组以包含正确的索引。
import numpy as np
import itertools
a = np.array([[3, 6, 7],
[1,-1, 3]])
idxs = np.array(list(itertools.product(*map(range, a.shape))))
x = idxs[:,0]
y = idxs[:,1]
values = a.flatten()
测试这个:
>>> x
array([0, 0, 0, 1, 1, 1])
>>> y
array([0, 1, 2, 0, 1, 2])
>>> values
array([ 3, 6, 7, 1, -1, 3])
>>> a[0,0]
3
>>> a[0,1]
6
>>> a[0,2]
7
>>> a[1,0]
1
>>> a[1,1]
-1
>>> a[1,2]
3
您可以在内部使用 2 个 enumerate(iterable) 进行 2 个循环(或嵌套列表理解)。
>>> import numpy as np
>>> ar1=np.ones([3,4])
>>> ar1
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
>>> ar1[::2,::3]=-1
>>> ar1[::3,:21]=-2
>>> ar1
array([[-2., -2., -2., -2.],
[ 1., 1., 1., 1.],
[-1., 1., 1., -1.]])
>>> x=[];y=[];values=[]
>>> for i,ari in enumerate(ar1):
... for j,valj in enumerate(ari):
... print i,j,valj
... x+=[i];y+=[j];values+=[valj]
...
0 0 -2.0
0 1 -2.0
0 2 -2.0
0 3 -2.0
1 0 1.0
1 1 1.0
1 2 1.0
1 3 1.0
2 0 -1.0
2 1 1.0
2 2 1.0
2 3 -1.0