从2D numpy数组中获取x,y,值1D数组(线性索引)

时间:2013-10-05 21:43:24

标签: python numpy

假设我有一个类似下面的2D数组:

array([3, 6, 7
       1,-1, 3])

我想在3个单独的数组中获取数组的xyvalue。换句话说:

x      = [0, 1, 0,  1, 0, 1]
y      = [0, 0, 1,  1, 2, 2]
values = [3, 1, 6, -1, 7, 3]

我该怎么做?

作为参考,这是MATLAB调用的linear indexing

6 个答案:

答案 0 :(得分:4)

如下:

x, y = np.indices(array.shape)
x = x.ravel(order='F')
y = y.ravel(order='F')
values = array.ravel(order='F')

答案 1 :(得分:3)

如果您与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))的解决方法。

答案 2 :(得分:2)

def xyval(A):
    x, y = np.indices(A.shape)
    return x.ravel(), y.ravel(), A.ravel()

答案 3 :(得分:1)

这个怎么样:

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])

答案 4 :(得分:1)

使用2D数组(矩阵)的flatten方法可以获得values数组。然后,只需构建xy数组以包含正确的索引。

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

答案 5 :(得分:0)

你可以在里面用2个枚举(可迭代)做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