相关疑难解决方法(0)

将2d阵列切成较小的2d阵列

有没有办法将ndy中的2d数组切成较小的2d数组?

[[1,2,3,4],   ->    [[1,2] [3,4]   
 [5,6,7,8]]          [5,6] [7,8]]
Run Code Online (Sandbox Code Playgroud)

所以我基本上想要将2x4阵列减少为2个2x2阵列.寻找用于图像的通用解决方案.

python numpy

45
推荐指数
3
解决办法
3万
查看次数

3d Numpy数组到2d

我有一个像这样的3d矩阵

arange(16).reshape((4,2,2))
array([[[ 0,  1],
        [ 2,  3]],

        [[ 4,  5],
        [ 6,  7]],

        [[ 8,  9],
        [10, 11]],

        [[12, 13],
        [14, 15]]])
Run Code Online (Sandbox Code Playgroud)

并希望以网格格式堆叠它们,最终得到

array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以不明确地hstacking(和/或vstacking)它们或添加额外的维度和重塑(不确定这会工作)?

谢谢,

python numpy multidimensional-array

26
推荐指数
1
解决办法
3万
查看次数

使用Numpy stride_tricks获取非重叠的数组块

我正在尝试使用numpy.lib.stride_tricks.as_strided来迭代数组的非重叠块,但是我无法找到参数的文档,所以我只能得到重叠的块.

例如,我有一个4x5阵列,我希望得到4个2x2块.我很好,右边和底边的额外细胞被排除在外.

到目前为止,我的代码是:

import sys
import numpy as np

a = np.array([
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
])

sz = a.itemsize
h,w = a.shape
bh,bw = 2,2

shape = (h/bh, w/bw, bh, bw)
strides = (w*sz, sz, w*sz, sz)
blocks = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

print blocks[0][0]
assert blocks[0][0].tolist() == [[1, 2], [6,7]]
print blocks[0][1]
assert blocks[0][1].tolist() == [[3,4], [8,9]]
print blocks[1][0]
assert blocks[1][0].tolist() == [[11, 12], [16, 17]]
Run Code Online (Sandbox Code Playgroud)

生成的块数组的形状似乎是正确的,但最后两个断言失败,可能是因为我的形状或步幅参数不正确.我应该设置哪些值来获得非重叠块?

python numpy

12
推荐指数
2
解决办法
8950
查看次数

用numpy在网格中显示图像的更加自我的方式

是否有更惯用的方式来显示图像网格,如下例所示?

import numpy as np

def gallery(array, ncols=3):
    nrows = np.math.ceil(len(array)/float(ncols))
    cell_w = array.shape[2]
    cell_h = array.shape[1]
    channels = array.shape[3]
    result = np.zeros((cell_h*nrows, cell_w*ncols, channels), dtype=array.dtype)
    for i in range(0, nrows):
        for j in range(0, ncols):
            result[i*cell_h:(i+1)*cell_h, j*cell_w:(j+1)*cell_w, :] = array[i*ncols+j]
    return result
Run Code Online (Sandbox Code Playgroud)

我试着用hstackreshape等,但不能得到正确的行为.

我有兴趣使用numpy这样做,因为使用matplotlib调用subplot和可以绘制多少图像是有限制的imshow.

如果您需要测试样本数据,可以像下面这样使用网络摄像头:

import cv2
import matplotlib.pyplot as plt
_, img = cv2.VideoCapture(0).read()

plt.imshow(gallery(np.array([img]*6)))
Run Code Online (Sandbox Code Playgroud)

python numpy image-processing python-3.x

12
推荐指数
2
解决办法
7960
查看次数

张量流或pytorch中的分区矩阵乘法

假设我有矩阵P,其大小[4, 4]划分为4个较小的矩阵[2,2]。如何有效地将此块矩阵乘以另一个矩阵(不是分区矩阵而是较小的矩阵)?

假设我们的原始矩阵为:

P = [ 1 1 2 2
      1 1 2 2
      3 3 4 4
      3 3 4 4]
Run Code Online (Sandbox Code Playgroud)

其中分为子矩阵:

P_1 = [1 1    , P_2 = [2 2  , P_3 = [3 3   P_4 = [4 4
       1 1]            2 2]          3 3]         4 4]
Run Code Online (Sandbox Code Playgroud)

现在我们的P是:

P = [P_1 P_2
     P_3 p_4]
Run Code Online (Sandbox Code Playgroud)

下一步,我想在P和较小矩阵之间进行逐元素乘法,其大小等于子矩阵的数量:

P * [ 1 0   =   [P_1  0  = [1 1 0 0 
      0 0 ]      0 …
Run Code Online (Sandbox Code Playgroud)

matrix multiplication matrix-multiplication tensorflow pytorch

6
推荐指数
1
解决办法
262
查看次数