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.concatenatenp.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(*)函数对数组转置(转)

根据一维数组中的值更改二维numpy数组中的某些值而无需for循环

numpy数组-二维数组

numpy.searchsorted 与二维数组

Numpy:如何使用数组的最后一个维度作为值?

python数据分析模块:numpy、pandas全解