Python 使用二维numpy阵列切片三维numpy阵列
是否可以使用二维阵列切片三维阵列。我认为这是可以做到的,但需要你指定轴 如果我有3个数组,那么: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
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]
(当然,这两个都应该是整数)