我有一个值矩阵,我想要一个包含矩阵和值的位置的向量。
第一个想法:双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。
答案 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)
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) ]