矩阵python的向量(positionx,positiony,value)

时间:2013-11-16 21:35:58

标签: python numpy matrix

我有一个值矩阵,我想要一个包含矩阵和值的位置的向量。

第一个想法:双bucle和存储索引和值

第二个想法:创建一个序列的ndarray

其他任何想法最有效吗?

抱歉我的英文。

输入(图像1C):

[[0 1 2 3 4 5]
 [6 7 8 9 10 11]]

输出:

[[0 0 1][0 1 2] [0 2 3] [0 3 4] [0 4 5] [1 0 6] [1 1 7] [1 2 8] [1 3 9] [1 4 10] [1 5 11] ... ]

谢谢大家的回答,你帮助解决了问题并理解了numpy。

3 个答案:

答案 0 :(得分:2)

这是一个非常干净的方法:

import numpy as np
arr = np.random.random((2, 6))
x, y = np.indices(arr.shape)
output = np.column_stack([x.ravel(), y.ravel(), arr.ravel()])

这是一种过于可爱的方式,可以最大限度地减少内存使用量:

import numpy as np
arr = np.random.random((2, 6))
output = np.indices(arr.shape + (1,), dtype=arr.dtype)
output[-1, ..., 0] = arr
output = output.reshape(arr.ndim + 1, -1).T

答案 1 :(得分:1)

import numpy as np

mat = np.arange(12).reshape(2,6)

result = np.c_[(np.array(list(np.ndindex(mat.shape))), mat.ravel())]
print(result)

产量

[[ 0  0  0]
 [ 0  1  1]
 [ 0  2  2]
 [ 0  3  3]
 [ 0  4  4]
 [ 0  5  5]
 [ 1  0  6]
 [ 1  1  7]
 [ 1  2  8]
 [ 1  3  9]
 [ 1  4 10]
 [ 1  5 11]]

警告:在list中使用np.array(list(np.ndindex(mat.shape)))形成一个临时Python列表。它很方便,但内存效率不高,因为Python列表比“等效”NumPy数组大得多。您可以使用np.fromiter来避免临时Python列表;例如,(与shx2's ndenumerate idea一起):

import numpy as np
arr = np.arange(12).reshape(2,6)

def ndindex_values(arr):
    for idx, value in np.ndenumerate(arr):
        for coord in idx:
            yield coord
        yield value

result = np.fromiter(
    ndindex_values(arr),
    count=arr.size*(len(arr.shape)+1),
    dtype=arr.dtype).reshape(arr.size, -1)

答案 2 :(得分:1)

使用numpy.ndenumerate

list(np.ndenumerate(a))
=>
[((0, 0), 0),
 ((0, 1), 1),
 ((0, 2), 2),
 ((0, 3), 3),
 ((0, 4), 4),
 ((0, 5), 5),
 ((1, 0), 6),
 ((1, 1), 7),
 ((1, 2), 8),
 ((1, 3), 9),
 ((1, 4), 10),
 ((1, 5), 11)]

要获得您在问题中指定的输出,即展平索引和值,您可以执行以下操作:

[ list(idx) + [value] for idx, value in np.ndenumerate(a) ]