numpy map二维数组值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy map二维数组值相关的知识,希望对你有一定的参考价值。
我正在尝试映射2D numpy数组的值,即在行上迭代(有效)并根据行索引追加值。
我尝试过的方法之一是:
source = misc.imread(fname) # Load some image
img = np.array(source, dtype=np.float64) / 255 # Cast and normalize values
w, h, d = tuple(img.shape) # Get dimensions
img = np.reshape(img, (w * h, d)) # Flatten 3D to 2D
# The actual problem:
# Map (R, G, B) pixels to (R, G, B, X, Y) to preserve position
img_data = ((px[0], px[1], px[2], idx % w, int(idx // w)) for idx, px in enumerate(img))
img_data = np.fromiter(img_data, dtype=tuple) # Get back to np.array
但解决方案提出:ValueError: cannot create object arrays from iterator
谁能建议如何在numpy
中有效地执行这种荒谬简单的操作?我不在乎这个库是多么复杂......为什么那段代码消耗了7000x5000像素的几个内存?
谢谢
答案
也许np.concatenate
和np.indices
:
np.concatenate((np.arange(40).reshape((4,5,2)), *np.indices((4,5,1))), axis=-1)[:,:,:-1]
Out[264]:
array([[[ 0, 1, 0, 0],
[ 2, 3, 0, 1],
[ 4, 5, 0, 2],
[ 6, 7, 0, 3],
[ 8, 9, 0, 4]],
[[10, 11, 1, 0],
[12, 13, 1, 1],
[14, 15, 1, 2],
[16, 17, 1, 3],
[18, 19, 1, 4]],
[[20, 21, 2, 0],
[22, 23, 2, 1],
[24, 25, 2, 2],
[26, 27, 2, 3],
[28, 29, 2, 4]],
[[30, 31, 3, 0],
[32, 33, 3, 1],
[34, 35, 3, 2],
[36, 37, 3, 3],
[38, 39, 3, 4]]])
[:,:,:-1]
剥离了一个'额外'0
条目,也许有更好的方式
以上是关于numpy map二维数组值的主要内容,如果未能解决你的问题,请参考以下文章
Python无须numpy,利用map函数与zip(*)函数对数组转置(转)