首页 > 解决方案 > 在没有 numpy 的情况下创建一个像 numpy.array() 这样的数组

问题描述

我有一个图像处理任务,我们被禁止使用 NumPy,所以我们需要从头开始编码。我已经完成了逻辑图像转换,但现在我坚持创建一个没有 numpy 的数组。

所以这是我最后的输出代码:

Output :
new_log =
[[236, 
  232, 
  226, 
  .
  .
  .
 198,
 204]]

我需要把它转换成一个数组,这样我就可以像这样写图像(使用 Numpy)

new_log =
array([[236, 232, 226, ..., 208, 209, 212],
       [202, 197, 187, ..., 198, 200, 203],
       [192, 188, 180, ..., 205, 206, 207],
       ...,
       [233, 226, 227, ..., 172, 189, 199],
       [235, 233, 228, ..., 175, 182, 192],
       [235, 232, 228, ..., 195, 198, 204]], dtype=uint8)
cv.imwrite('log_transformed.jpg', new_log) 
# new_log must be shaped like the second output

标签: pythonarraysimagelistnumpy

解决方案


您可以创建一个简单的函数来获取您的列表并以类似于 NumPy 的方式重塑它np.reshape()。但它不会很快,而且它对数据类型(NumPy dtype)一无所知,所以......我的建议是挑战不喜欢 NumPy 的人。特别是如果您使用的是 OpenCV——它取决于 NumPy

这是您可以在纯 Python 中执行的操作的示例:

def reshape(l, shape):
    """Reshape a list.

    Example
    -------
    >>> l = [1,2,3,4,5,6,7,8,9]
    >>> reshape(l, shape=(3, -1))
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    """
    nrows, ncols = shape
    if ncols == -1:
        ncols = len(l) // nrows
    if nrows == -1:
        nrows = len(l) // ncols
    array = []
    for r in range(nrows):
        row = []
        for c in range(ncols):
            row.append(l[ncols*r + c])
        array.append(row)
    return array

推荐阅读