Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用二维numpy阵列切片三维numpy阵列_Python_Arrays_Numpy_Slice - Fatal编程技术网

Python 使用二维numpy阵列切片三维numpy阵列

Python 使用二维numpy阵列切片三维numpy阵列,python,arrays,numpy,slice,Python,Arrays,Numpy,Slice,是否可以使用二维阵列切片三维阵列。我认为这是可以做到的,但需要你指定轴 如果我有3个数组,那么: A = [[1,2,3,4,5], [1,3,5,7,9], [5,4,3,2,1]] # shape (3,5) B1 = [[1], [2], [3]] # shape (3, 1) B2 = [[4], [3], [4]] # shape (3,1) 是否可以使用B1和B2对A进行切片,如: Out = A[B1:B2

是否可以使用二维阵列切片三维阵列。我认为这是可以做到的,但需要你指定轴

如果我有3个数组,那么:

A = [[1,2,3,4,5],
     [1,3,5,7,9],
     [5,4,3,2,1]] # shape (3,5)

B1 = [[1],
      [2],
      [3]] # shape (3, 1) 

B2 = [[4],
      [3],
      [4]] # shape (3,1)
是否可以使用B1和B2对A进行切片,如:

Out = A[B1:B2]
这样它就可以回报我:

Out = [[2,3,4,5],
       [5, 7],
       [2, 1]]

或者,如果切片在
Out
中创建了不同长度的数组,那么这就行不通了吗?

Numpy针对具有固定维度的同构数字数组进行了优化,因此它不支持不同的行或列大小

但是,您可以通过使用阵列列表来实现所需的功能:

Out = [A[i, B1[i]:B2[i]+1] for i in range(len(B1))]

Numpy针对具有固定维度的同构数字数组进行了优化,因此它不支持不同的行或列大小

但是,您可以通过使用阵列列表来实现所需的功能:

Out = [A[i, B1[i]:B2[i]+1] for i in range(len(B1))]

您期望的结果在每一行中有不同数量的项-这是一个强有力的指标,表明完全矢量化的解决方案是不可能的。它对每一行或每一列执行的操作不同

其次,
n:m
转换为
slice(n,m)
<代码>切片只接受整数,不接受列表或数组

显而易见的解决方案是对行进行某种形式的迭代:

In [474]: A = np.array([[1,2,3,4,5],
          [1,3,5,7,9],
          [5,4,3,2,1]]) # shape (3,5)

In [475]: B1=[1,2,3]  # no point in making these 2d

In [476]: B2=[5,4,5]  # corrected values

In [477]: [a[b1:b2] for a,b1,b2 in zip(A,B1,B2)]
Out[477]: [array([2, 3, 4, 5]), array([5, 7]), array([2, 1])]
如果
A
是嵌套列表,则此解决方案同样有效

In [479]: [a[b1:b2] for a,b1,b2 in zip(A.tolist(),B1,B2)]
Out[479]: [[2, 3, 4, 5], [5, 7], [2, 1]]
这两个列表也可以转换为一维索引数组,然后从
A.ravel()
中选择值。这将产生一个一维数组,例如

array([2, 3, 4, 5, 5, 7, 2, 1]
从理论上讲,这可能是np.split,但最近关于其他问题的经验表明,这不会节省很多时间

如果行选择的长度都相同,我们可以得到一个2d数组。每行包含2个元素的迭代版本:

In [482]: np.array([a[b1:b1+2] for a,b1 in zip(A,B1)])
Out[482]: 
array([[2, 3],
       [5, 7],
       [2, 1]])
我在前面讨论过如何通过一次索引操作生成这种结果的问题


slice
接受的内容上:

In [486]: slice([1,2],[3,4]).indices(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-486-0c3514e61cf6> in <module>()
----> 1 slice([1,2],[3,4]).indices(10)

TypeError: slice indices must be integers or None or have an __index__ method

它仍然有一个迭代——生成进入
np.r\uu
(将其扩展为一个索引数组)

您想要的结果在每行中有不同数量的术语——这是一个强有力的指标,表明完全矢量化的解决方案是不可能的。它对每一行或每一列执行的操作不同

其次,
n:m
转换为
slice(n,m)
<代码>切片只接受整数,不接受列表或数组

显而易见的解决方案是对行进行某种形式的迭代:

In [474]: A = np.array([[1,2,3,4,5],
          [1,3,5,7,9],
          [5,4,3,2,1]]) # shape (3,5)

In [475]: B1=[1,2,3]  # no point in making these 2d

In [476]: B2=[5,4,5]  # corrected values

In [477]: [a[b1:b2] for a,b1,b2 in zip(A,B1,B2)]
Out[477]: [array([2, 3, 4, 5]), array([5, 7]), array([2, 1])]
如果
A
是嵌套列表,则此解决方案同样有效

In [479]: [a[b1:b2] for a,b1,b2 in zip(A.tolist(),B1,B2)]
Out[479]: [[2, 3, 4, 5], [5, 7], [2, 1]]
这两个列表也可以转换为一维索引数组,然后从
A.ravel()
中选择值。这将产生一个一维数组,例如

array([2, 3, 4, 5, 5, 7, 2, 1]
从理论上讲,这可能是np.split,但最近关于其他问题的经验表明,这不会节省很多时间

如果行选择的长度都相同,我们可以得到一个2d数组。每行包含2个元素的迭代版本:

In [482]: np.array([a[b1:b1+2] for a,b1 in zip(A,B1)])
Out[482]: 
array([[2, 3],
       [5, 7],
       [2, 1]])
我在前面讨论过如何通过一次索引操作生成这种结果的问题


slice
接受的内容上:

In [486]: slice([1,2],[3,4]).indices(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-486-0c3514e61cf6> in <module>()
----> 1 slice([1,2],[3,4]).indices(10)

TypeError: slice indices must be integers or None or have an __index__ method
它仍然有一个迭代——生成进入
np.r\ucode>(将其扩展为单个索引数组)的切片-

这里有一个-


这真的很好,但它并没有得到我想要的,它不断返回错误,即切片无效。然而,它确实让我思考,虽然效率不高,但我可以使用“for I in range(len(B1))”后跟out.append([a[I][B1[I]:[B2[I]]),让它在循环中工作。它可能没有那么有效,但它可以满足我的需要。它看起来并不太慢。我自己测试了代码,没有发现任何问题。你确定你在形状为(3,5)、(3,1)和(3,1)的numpy数组上尝试过这个方法吗?不可否认,我的数组的形状与本例不同。A是(40000432),B1和B2是(40000,1)。我假设我提供的示例只是一个缩小的版本,如果不是,很抱歉。只要
B2[I]
高于或等于
B1[I]
(当然,这两个都应该是整数)这真的很好,但它并没有让我得到我想要的,它不断返回切片无效的错误。但是它确实让我思考,虽然效率不高,但我可以让它在一个循环中工作,使用“for I in range(len(B1))”后跟out.append([a[I][B1[I]:[B2[I]])。它可能没有那么有效,但它可以满足我的需要。它看起来并不太慢。我自己测试了代码,没有发现任何问题。你确定你在形状为(3,5)、(3,1)和(3,1)的numpy数组上尝试过这个方法吗?不可否认,我的数组的形状与本例不同。A是(40000432),B1和B2是(40000,1)。我假设我提供的示例只是一个缩小的版本,如果不是,很抱歉。只要
B2[I]
高于或等于
B1[I]
(当然,这两个都应该是整数)