Python 从大于2维的numpy数组中选择随机窗口

Python 从大于2维的numpy数组中选择随机窗口,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,如何从大于2维的numpy数组中选择随机窗口,其中该窗口相对于2个不同维是随机的 我想做一些类似于本文中答案的事情,但在3个维度,而不是2个维度: 我试图矢量化的内容示例(即,我试图避免for循环): 我们可以利用基于的来获得滑动窗口 在这里,view\u as\u windows是一个方便的功能,它可以帮助我们轻松设置滑动窗口,而不必费心设置as\u strip功能。我们可以利用based来获得滑动窗口 在这里,view\u as\u windows是一个方便的功能,它可以帮助我们轻松设置滑

如何从大于2维的numpy数组中选择随机窗口,其中该窗口相对于2个不同维是随机的

我想做一些类似于本文中答案的事情,但在3个维度,而不是2个维度:

我试图矢量化的内容示例(即,我试图避免for循环):

我们可以利用基于的来获得滑动窗口

在这里,
view\u as\u windows
是一个方便的功能,它可以帮助我们轻松设置滑动窗口,而不必费心设置
as\u strip
功能。

我们可以利用based来获得滑动窗口


在这里,
view\u as\u windows
是一个方便的功能,它可以帮助我们轻松设置滑动窗口,而无需到处乱动来设置
as\u strip
功能。

使用我的
窗口和


为清楚起见,在原始函数中有许多未考虑的边缘情况(尤其是不使用一个窗口/轴,除非它们被格式化为元组)。

使用我的
窗口和


为清楚起见,在原始函数中有许多未在此处说明的边缘情况(尤其是不使用一个窗口/轴,除非它们被格式化为元组)。

请更清楚地回答您的问题。发布的解决方案是否解决了您的问题?我仍在实施/测试它们。我会让你知道的,谢谢!请更清楚地回答您的问题。发布的解决方案是否解决了您的问题?我仍在实施/测试它们。我会让你知道的,谢谢!我认为r1和r2应该是这些,因为random.randint包含较大的数字,而np.random.randint是独占的(如果我正确理解你的解决方案的话):r1=np.random.randint(0,np\u 3D\u array.shape[0],k)r2=np.random.randint(0,np\u 3D\u array.shape[1]-m+1,k)@teter123f我的错了,我认为
random.randint
np.random.randint
相同,但前者使用第二个参数作为包含符。后期编辑。请检查它。嗯,我在尝试此解决方案时遇到了此错误(如果输入np_3D_数组有问题,请使用idk)。制作np_3D_数组的方法是读取a x b形状的csv文件,并将每个文件附加到列表中,然后调用np.array(列表)来创建一个c x a x b ndarray。。。。“/usr/local/lib/python3.6/dist packages/skimage/util/shape.py:246:RuntimeWarning:在不复制的情况下无法提供非连续输入数组的视图。warn(RuntimeWarning(“无法提供非连续输入的视图”)@teter123f要使此解决方案起作用,输入必须是连续的,这显然与您的输入不同。因此,在不知道输入源的情况下四处走动的一种方法是复制
np_3D_数组
,然后使用它。因此,使用类似
ar=np_3D_数组.copy()的方法
然后使用
ar
代替发布代码中的
np\u 3D\u数组
。当我使用np\u 3D\u array.copy()时,仍然会出现非连续错误。我可以通过使用np.ascontiguousarray(np\u 3D\u array)来消除错误。然而,对于我的特定用例,这个解决方案实际上似乎较慢。我需要研究一下为什么这种矢量化格式较慢(具有讽刺意味的是)(我的np_3D_数组约为150 x 50000 x 10,k(即for循环的次数)约为3000,所以…非常困惑为什么它较慢)我认为r1和r2应该是这些,因为random.randint包含较大的数字,而np.random.randint是独占的(如果我理解正确的话):r1=np.random.randint(0,np\u 3D\u array.shape[0],k)r2=np.random.randint(0,np\u 3D\u array.shape[1]-m+1,k)@teter123f My bad,我认为
random.randint
np.random.randint
相同,但前者使用第二个参数作为包含参数。后编辑。请检查它。嗯,我在尝试此解决方案时遇到此错误(idk,如果我的输入np_3D_数组有问题。我制作np_3D_数组的方法是读取a x b形状的csv文件,并将每个文件附加到列表中,然后调用np.array(列表)来创建一个c x a x b ndarray。。。。“/usr/local/lib/python3.6/dist packages/skimage/util/shape.py:246:RuntimeWarning:在不复制的情况下无法提供非连续输入数组的视图。warn(RuntimeWarning(“无法提供非连续输入的视图”)@teter123f要使此解决方案起作用,输入必须是连续的,这显然与您的输入不同。因此,在不知道输入源的情况下四处走动的一种方法是复制
np_3D_数组
,然后使用它。因此,使用类似
ar=np_3D_数组.copy()的方法
然后使用
ar
代替发布代码中的
np\u 3D\u数组
。当我使用np\u 3D\u array.copy()时,仍然会出现非连续错误。我可以通过使用np.ascontiguousarray(np\u 3D\u array)来消除错误。然而,对于我的特定用例,这个解决方案实际上似乎较慢。我需要研究一下为什么这种矢量化格式较慢(具有讽刺意味的是)(我的np_3D_数组约为150 x 50000 x 10,k(即for循环的次数)约为3000,所以…非常困惑为什么它较慢)
import random
import numpy as np

ls = []
m = 3 # sequence length
k = 8 #batch_size

np_3D_array = np.random.randint(0,100, size = (5,7,4)) #random 3D array

for ii in range(k):
  random_sheet = random.randint(0,np_3D_array.shape[0] - 1)
  random_row = random.randint(0, np_3D_array.shape[1] - m)
  ls.append(np_3D_array[random_sheet, random_row:random_row + m , :])

final_output = np.array(ls)

print(final_output.shape) #prints (8, 3, 4) to stdoout
from skimage.util.shape import view_as_windows

w = view_as_windows(np_3D_array,(1,m,1))[...,0,:,0]
r1 = np.random.randint(0,np_3D_array.shape[0], k)
r2 = np.random.randint(0, np_3D_array.shape[1] - m + 1, k)
final_output = w[r1,r2].swapaxes(1,2)
def sample_nd(arr, window_shape, axis, k = 1):
    windows = window_nd(arr, window = window_shape, axis = axis)
    windows = windows.reshape((-1,) + windows.shape[len(axis):])
    index = np.random.randint(0, windows.shape[0], k)
    return windows[index].squeeze()

sample_nd(np_3D_array, window_shape = (1, 3), axis = (0, 1), k = 8).shape

(8, 3, 4)