【问题标题】:How to go through a matrix alongside a vector?如何通过向量旁边的矩阵?
【发布时间】:2018-01-13 08:24:31
【问题描述】:

我正在尝试为视频游戏制作 2D 照明系统。我有我的精灵,在32 px² (32x32) png 文件中。颜色键是(255, 0, 255)。我使用 Pillow 加载图像,并将其转换为数组,并使用 Pillow 从数组中重建图像。

基本上,我想以某种方式遍历阵列中的每个像素,以使它们变亮(((r,g,b)+(255,255,255))/4 用于第一层,x2 用于第二层等)我有一个表示光线方向的二维单位向量来自。

问题是,我不知道如何遍历这个向量之后的数组。

M_3 中的示例:

1 2 3

4 5 6

7 8 9

vector : (1, -1)(左上角的光源)

应该变成:

[1, 2, 4, 3, 5, 7, 6, 8, 9]

【问题讨论】:

  • 您的示例可能会诱使懒惰的读者认为这是关于沿对角线遍历数组。我会建议更多vector 不那么琐碎的示例。

标签: python arrays image numpy matrix


【解决方案1】:
a = np.arange(1,10).reshape(3,3)

a
#array([[1, 2, 3],
#       [4, 5, 6],
#       [7, 8, 9]])

元素从左上角到右下角被展平,即(x_index + y_index)的升序,你可以从a中通过x index和y之和对展平的元素进行排序索引:

idx, idy = map(np.arange, a.shape)
a.ravel()[(idx[:,None] + idy).ravel().argsort()]

# array([1, 2, 4, 3, 5, 7, 6, 8, 9])

要从不同的角落穿过,您可以沿 x 轴、y 轴或两者反转 a,具体取决于您要从哪里开始:

例如:

右上角(-1,-1)

a[:,::-1].ravel()[(idx[:,None] + idy).ravel().argsort()]
# array([3, 2, 6, 1, 5, 9, 4, 8, 7])

左下角 (1, 1)

a[::-1,:].ravel()[(idx[:,None] + idy).ravel().argsort()]
# array([7, 8, 4, 9, 5, 1, 6, 2, 3])

右下角 (-1, 1)

a[::-1,::-1].ravel()[(idx[:,None] + idy).ravel().argsort()]
# array([9, 8, 6, 7, 5, 3, 4, 2, 1])

【讨论】:

  • 好吧,这行得通,但我不明白如何,为什么,或者如何用不同的向量来实现它。示例:使用向量 (-1, -1) 应该返回 [3, 2, 6, 1, 5, 9, 4, 8, 7] 等
  • 您可以在展平之前反转阵列。用其他几个选项更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2020-05-09
  • 1970-01-01
  • 2012-10-11
  • 2019-04-18
  • 2022-12-03
相关资源
最近更新 更多