用于复杂变换的Numpy图块

yv5phkfx  于 2023-06-29  发布在  其他
关注(0)|答案(2)|浏览(136)

假设有一个数组

arr = np.array([[1,2,3], [4,5,6]])

我的目标是重复N = 2axis = 0上的元素,因此所需的输出为

array([[[1., 4.],
    [1., 4.]],

   [[2., 5.],
    [2., 5.]],

   [[3., 6.],
    [3., 6.]]])

我试过np.ones((2,2))*arr.T[:,:,None],但输出不同

array([[[1., 1.],
    [4., 4.]],

   [[2., 2.],
    [5., 5.]],

   [[3., 3.],
    [6., 6.]]])

有没有简单的方法来解决这个问题?我猜这是换位的问题,但我不知道如何实现这一点。

    • 它是:
np.transpose(np.ones((2,2))*arr.T[:,:,None], axes = tuple([0, 2, 1]))
rjzwgtxy

rjzwgtxy1#

虽然@chrslg的stride_tricks解决方案可能很快,但它不容易阅读。相反,我建议使用numpy np.repeat函数,它可以清楚地说明您正在做什么。也就是说,您不能直接使用它来获得想要的结果,您首先需要添加另一个维度来拆分行。由于这种分割,它应该应用于axis=1而不是0。最后的结果需要进行转置以匹配您要查找的内容。

import numpy as np

arr = np.array([[1,2,3], [4,5,6]])
res = np.repeat(arr[:, None, :], 2, axis=1).T
print(res)

输出:

[[[1 4]
  [1 4]]

 [[2 5]
  [2 5]]

 [[3 6]
  [3 6]]]
5uzkadbs

5uzkadbs2#

一种方法

(s0,s1)=arr.strides
np.lib.stride_tricks.as_strided(arr, shape=(3, 2, 2), strides=(s1,0,s0))

请注意,它基本上是免费的:它什么也不做,并返回相同的arr。只是,步长的改变使得迭代沿着arr轴1进行,用于新阵列轴0;只对轴1重复;并且对于新的阵列轴2沿着arr轴0。
适用于所有尺寸的2D arr和所有重复

def myrepeat(arr, n):
   (sh0,sh1)=arr.shape
   (st0,st1)=arr.strides
   return np.lib.stride_tricks.as_strided(arr, shape=(sh1,n,sh0), strides=(st1,0,st0))

# Example
arr=np.arange(20).reshape(4,5)
myrepeat(arr,3)

返回

array([[[ 0,  5, 10, 15],
        [ 0,  5, 10, 15],
        [ 0,  5, 10, 15]],

       [[ 1,  6, 11, 16],
        [ 1,  6, 11, 16],
        [ 1,  6, 11, 16]],

       [[ 2,  7, 12, 17],
        [ 2,  7, 12, 17],
        [ 2,  7, 12, 17]],

       [[ 3,  8, 13, 18],
        [ 3,  8, 13, 18],
        [ 3,  8, 13, 18]],

       [[ 4,  9, 14, 19],
        [ 4,  9, 14, 19],
        [ 4,  9, 14, 19]]])

相关问题