【问题标题】:get one array from vectors - python从向量中获取一个数组 - python
【发布时间】:2017-11-09 16:27:29
【问题描述】:

我在这个问题上苦苦挣扎了一段时间,但我没有找到解决方案。我尝试绘制热图并阅读了一些stuff,但问题有所不同。 我有 3 个向量:

    x = [ -1,  0,  1, -1,  0,  1,  0, -1,  1 ]
    y = [ -1, -1, -1,  0,  0,  0,  1,  1,  1 ]
    E = [  3,  1,  4,  1,  5,  9,  6,  2,  5 ]

我想要的是一个像下面这样用于实际绘图的矩阵:

E_xy = [ [ 3, 1, 4],
         [ 1, 5, 9],
         [ 2, 6, 5]]

x[0] 属于 y[0] 属于 E[0] 等等。

最好/最简单的方法是什么?

请注意:不能使用矩阵的排序(参见 E[7] 和 E[8] 以及生成的 E_xy[2,0] 和 E_xy[2,1])。

【问题讨论】:

  • 我不太清楚你的意思。是否可以考虑改写?它看起来只是将一个长度为 9 的数组拆分为三个长度为 3 的数组,同时保留顺序。即E_xy = [ E[i:i + 3] for i in [x*len(E)/3 for x in range(3)]]
  • 如果 E 未正确排序,您如何确定正确排序?

标签: python arrays


【解决方案1】:

假设一个 NxN 方阵

import numpy as np

x = np.array([ -1,  0,  1, -1,  0,  1,  0, -1,  1 ])
y = np.array([ -1, -1, -1,  0,  0,  0,  1,  1,  1 ])
E = np.array([  3,  1,  4,  1,  5,  9,  6,  2,  5 ])
N = int(np.sqrt(E.size))

sorting = np.argsort(x + y*N)
E_xy = E[sorting].reshape(N,N)

【讨论】:

  • 这并没有考虑到 x 和 y 的偏移量,是吗?
  • “偏移量”是什么意思?它使用x 中的值作为低阶(列)索引,y 中的值作为高阶(行)索引。
  • 您在编辑中通过添加 argsort 修复了它 - 之前,您没有尊重 x,y 索引。
  • 是的,很遗憾您可以在 SO 上编辑答案帖子,但 cmets 保持不变。他们应该强制用户添加新答案,或者标记与先前答案相关的 cmets。
【解决方案2】:

将您的 xy 列表解释为相对于矩阵中心元素的位置偏移定义,您可以首先创建包含您的位置的元组,然后将所有内容填充到新创建的所需维度的矩阵中:

x = [ -1,  0,  1, -1,  0,  1,  0, -1,  1 ]
y = [ -1, -1, -1,  0,  0,  0,  1,  1,  1 ]
E = [  3,  1,  4,  1,  5,  9,  6,  2,  5 ]

positions = [
    (x[i] + 1, y[i] + 1, E[i])
    for i in range(len(x))
]

result = [
    [None] * 3 for _ in range(3)
]
for x, y, value in positions:
    result[y][x] = value

print(result)

请注意,这不是通用解决方案;它假定矩阵始终为3x3;它需要进行更改才能使其成为任意形状矩阵的通用方法。

上面的代码打印:

>>> [[3, 1, 4], [1, 5, 9], [2, 6, 5]]

另外,上面的代码当然可以写得更有效率,但是这样会失去可读性;因此,如果需要(如果矩阵变大),您可以自行决定是否节省内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2013-02-25
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多