【问题标题】:Arrange a numpy array to represent physical arrangement with 2d color plot排列一个 numpy 数组以表示具有 2d 彩色图的物理排列
【发布时间】:2023-03-27 20:43:01
【问题描述】:

我正在尝试绘制一个代表一组物理像素的二维 numpy 数组。但是,像素本身的排列方式非常复杂,我在排列阵列时遇到了麻烦,以便彩色图代表物理设置。这是我当前数组的布局,下面是它需要组织成的布局图片(红色数字是指下面数组的第一维。左下象限是第二维。)我打算使用 pcolor,但如果有任何东西更适合这个问题,我当然愿意接受其他选择。对此我将不胜感激。

[[  575.40625    984.40625    560.234375   936.0625     733.84375
    725.9375     469.234375   828.046875   210.421875   522.4375     713.375
    466.484375   679.8125     242.296875   645.328125   666.265625]
 [  976.390625   668.46875    513.328125   769.359375  1343.65625
   1068.3125    1206.21875   1447.484375   571.359375   420.71875
    246.03125    333.15625    626.921875   615.03125    867.03125
   1051.34375 ]
 [  498.1875    1176.453125   670.609375   597.578125   765.078125
    713.8125     825.84375    760.171875   667.015625   755.40625
   1003.71875    687.921875   448.921875   574.90625    598.859375
    487.09375 ]
 [  564.203125   485.140625   652.625      740.875      465.875     1152.03125
    623.15625    949.28125    722.515625   397.046875   529.03125    487.
    427.109375   424.         495.734375   510.453125]]

【问题讨论】:

  • 你的点的排列是一个空间填充Z曲线。也许这可以帮助您入门。
  • 您提供的嵌套列表中的每一行对应下图中的一个红色框?如果是这样的话,那么我看到了一个问题。每个红色框都有相同数量的元素,但是,在您的嵌套列表中,有些有 6 个元素,有些有 5 个。此外,每个嵌套列表将如何分布在红色框中,即按列、按行、按其他方式?
  • @MartinUeding 好点。你知道我可以在 numpy 中使用什么东西来展平数组,然后使用算法使用 z 阶曲线形成物理结构吗?
  • @FilipKilibarda 上述数组的尺寸由方括号指定,而不是物理行。如果不清楚,我很抱歉。第一维索引对应红色框,第二维索引对应黑色数字(特别是左下角,然后在其他红色框中再迭代3次)。
  • 您的实际输入是否只是一个要绘制为 8x8 图像的一维序列(包含 64 个元素),序列中的索引如蓝色网格中所示?

标签: python arrays numpy matplotlib


【解决方案1】:

如果将 8x8 网格视为二维 numpy 数组,则将对应于一维数据中给定索引的行计算为索引的位 1、3 和 5 的二进制值。类似地,该列是使用索引的位 0、2 和 4 计算的。这是一个将索引转换为行和列的函数:

def row_col_coords(index):
    # Convert bits 1, 3 and 5 to row
    row = 4*((index & 0b100000) > 0) + 2*((index & 0b1000) > 0) + 1*((index & 0b10) > 0)
    # Convert bits 0, 2 and 4 to col
    col = 4*((index & 0b10000) > 0) + 2*((index & 0b100) > 0) + 1*((index & 0b1) > 0)
    return (row, col)

例如,

In [114]: row_col_coords(45)
Out[114]: (6, 3)

即对于索引 45,row(即y)为 6,col 为 3。

计算是矢量化的,因此该函数实际上处理一个索引数组。例如,

In [116]: row_col_coords(np.array([45, 46, 47, 48]))
Out[116]: (array([6, 7, 7, 4]), array([3, 2, 3, 4]))

这是一个长度为 64 的示例一维数据数组。它只是 [100, 101, 102, ..., 163] 所以我们可以很容易地看出数组是正确的。

In [116]: data = 100 + np.arange(64.)

要形成 8x8 数组,首先创建与数据索引 [0, 1, 2, ..., 63] 对应的行和列索引:

In [117]: row, col = row_col_coords(np.arange(64))

现在创建一个 8x8 数组并用data 填充它,使用rowcol 得到所需的顺序:

In [118]: a = np.empty((8, 8))

In [119]: a[row, col] = data

In [120]: a
Out[120]: 
array([[ 100.,  101.,  104.,  105.,  116.,  117.,  120.,  121.],
       [ 102.,  103.,  106.,  107.,  118.,  119.,  122.,  123.],
       [ 108.,  109.,  112.,  113.,  124.,  125.,  128.,  129.],
       [ 110.,  111.,  114.,  115.,  126.,  127.,  130.,  131.],
       [ 132.,  133.,  136.,  137.,  148.,  149.,  152.,  153.],
       [ 134.,  135.,  138.,  139.,  150.,  151.,  154.,  155.],
       [ 140.,  141.,  144.,  145.,  156.,  157.,  160.,  161.],
       [ 142.,  143.,  146.,  147.,  158.,  159.,  162.,  163.]])

行颠倒了!那是因为 numpy 数组首先显示第 0 行,然后是第 1 行,等等。要以“正确”顺序查看数据,只需反转数组即可:

In [121]: a[::-1]
Out[121]: 
array([[ 142.,  143.,  146.,  147.,  158.,  159.,  162.,  163.],
       [ 140.,  141.,  144.,  145.,  156.,  157.,  160.,  161.],
       [ 134.,  135.,  138.,  139.,  150.,  151.,  154.,  155.],
       [ 132.,  133.,  136.,  137.,  148.,  149.,  152.,  153.],
       [ 110.,  111.,  114.,  115.,  126.,  127.,  130.,  131.],
       [ 108.,  109.,  112.,  113.,  124.,  125.,  128.,  129.],
       [ 102.,  103.,  106.,  107.,  118.,  119.,  122.,  123.],
       [ 100.,  101.,  104.,  105.,  116.,  117.,  120.,  121.]])

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2021-09-25
    相关资源
    最近更新 更多