【问题标题】:Numpy: reshape uneven 1D array to 2D array for byte plottingNumpy:将不均匀的一维数组重塑为二维数组以进行字节绘图
【发布时间】:2019-03-26 15:05:01
【问题描述】:

这对每个人来说可能都太容易了,但正如我在主题中提到的,有没有办法将不均匀的 1D numpy 数组重塑为 2D numpy 数组? 当我说不均匀的一维数组时,形状是 (34191,) 这来自使用 np.fromfile

读取二进制文件

我在这里尝试做的实际事情实际上是将我正在读取的二进制文件显示/绘制为图像(如字节图)。 因此,将文件读取为 1D numpy 数组,将其转换为 2D 数组,显示/绘图/保存为灰度图像。

感谢任何想法

【问题讨论】:

  • 您希望图像具有什么尺寸?
  • 我想先试试 64x64。感谢回复
  • 我想我并没有真正得到你想要的东西。您有 34191 个值并希望将它们排列在 2D 网格中,对吗?但是,如果网格只有 64x64,则这些值显然不适合。我想我没有正确理解这个问题,你能试着澄清一下吗?
  • 如前所述,我想做一个字节图。也就是说,我的二进制文件的每个字节都被视为一个像素,并被绘制/显示/保存为图像。所以它就像二进制十六进制查看器,但我想将二进制文件的可视化保存为 nxm 大小的图像
  • arr[:n*m].reshape(n,m) 会将其转换为二维数组,前提是n*m 小于总长度

标签: numpy reshape


【解决方案1】:

如果我对问题的解释正确,您有一个一维数组,并且您想将其显示为图像,但您不知道 先验它应该是什么形状。

此函数查找数字的“最平方”形状(即值最接近的两个因子)。

import numpy as np

def closest_factor_pair(x: int) -> tuple:
    """
    Tries to find the pair of factors of x, i.e. the
    closest integers to the square root of x.

    Example
    >>> closest_factor_pair(34191)
    (131, 261)
    """
    for i in range(int(np.sqrt(x)), 0, -1):
        if x % i == 0:
            return i, int(x/i)
    return None

我们可以用它来猜测你的数组的大小并显示它:

>>> size = 34191
>>> shape = closest_factor_pair(size)
(131, 261)

如果你有你的数组,你可以重塑它并显示:

import matplotlib.pyplot as plt

arr = np.random.random(size)
plt.matshow(arr.reshape(shape))

这给出了:

【讨论】:

  • 非常感谢kwinkunks。正是我要找的东西
  • 不用担心@jaysonpryde。我突然想到,您需要尝试使用(a, b)(b, a) 进行重塑,看看哪个更“有条理”。也许您可以找出一种方法来自动判断哪个是正确的/最好的,具体取决于您的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多