将两个不同大小的numpy数组作为2D数组进行迭代

balp4ylt  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(112)

简而言之,我有一种类似Python的方式来迭代二维,但由于它使用的是大数字和多个数组,所以我希望使用tile_iternumpy版本,而不是列表解析中的双for循环。我希望它的值与所示的相同,但在相同形状的2D numpy数组中(而不仅仅是用np.array Package 器转换我的当前数组-我试图避免列表解析)
以下是我目前拥有的最小化,简化版本:

import numpy as np

x_cam_screen_range = np.linspace((6, 0), (18, 1), 3)
y_cam_screen_range = np.linspace((-3, 0), (3, 1), 3)
tile_iter = [(x, screen_x, y, screen_y)
             for x, screen_x in x_cam_screen_range
             for y, screen_y in y_cam_screen_range]

# current list response:
# [(6.0, 0.0, -3.0, 0.0),
# (6.0, 0.0, 0.0, 0.5),
# (6.0, 0.0, 3.0, 1.0),
# (12.0, 0.5, -3.0, 0.0),
# (12.0, 0.5, 0.0, 0.5),
# (12.0, 0.5, 3.0, 1.0),
# (18.0, 1.0, -3.0, 0.0),
# (18.0, 1.0, 0.0, 0.5),
# (18.0, 1.0, 3.0, 1.0)]

有没有一种方法可以以numpy友好的方式创建tile_iter?如果有一个现存的问题反映了这一点,我无法为我的生活找到它(但如果你能,我会很感激)。

quhf5bfb

quhf5bfb1#

一个可能的答案是,做一些与tuple列表非常相似的事情

(np.linspace((0.5,0,0,0),(0.5,1,0,0), resolution_x)[:,None,:]+np.linspace((0,0,-0.37,0),(0,0,0.37,1),resolution_y)[None,:,:]).reshape(-1,4)

0,0填充到linspace参数,所以+做了所有的广播可能是我的一些懒惰。在广播时可能会连接2对。
但主要思想是,在(resolution_x,1,4)形状的数组和(1,resolution_y,4)形状的数组之间进行运算(这里是+)通常(+就是这种情况)使numpy执行resolution_xresolution_y的双重迭代,以计算所有resolution_x*resolution_y可能的组合。所以,这是numpy迭代双循环的方法。(也就是说,永远不要让for循环变白,而是让numpy在内部执行)
使用更新的数据,并将计算拆分为多行

x_cam_screen_range = np.linspace((6, 0,0,0), (18, 1,0,0), 3)
y_cam_screen_range = np.linspace((0,0,-3, 0), (0,0,3, 1), 3)
tile_iter = (x_cam_screen_range[:,None,:]+y_cam_screen_range[None,:,:]).reshape(-1,4)
#array([[ 6. ,  0. , -3. ,  0. ],
#       [ 6. ,  0. ,  0. ,  0.5],
#       [ 6. ,  0. ,  3. ,  1. ],
#       [12. ,  0.5, -3. ,  0. ],
#       [12. ,  0.5,  0. ,  0.5],
#       [12. ,  0.5,  3. ,  1. ],
#       [18. ,  1. , -3. ,  0. ],
#       [18. ,  1. ,  0. ,  0.5],
#       [18. ,  1. ,  3. ,  1. ]])

相关问题