从 Numpy 中的向量创建矩阵的一部分
Creating a slice of a matrix from a vector in Numpy
假设我有一个大小为 5 x 4 的矩阵 A
,还有一个长度为 5 的向量 b
,其元素表示我在矩阵 [=11 的相应行中需要多少个值=].这意味着 b
中的每个值都以 A
的第二维大小为上限。我的问题是如何在给定向量的情况下对矩阵进行切片,这是通过编写 vector[:n]
获取向量的整数值元素的复杂版本
例如,这可以通过对 A 的行进行循环来实现:
import numpy
A=numpy.arange(20).reshape((5,4))
b=numpy.array([0, 3, 3, 2, 3])
output=A[0, :b[0]]
for i in xrange(1, A.shape[0]):
output=numpy.concatenate((output, A[i, :b[i]]), axis=0)
# output is array([ 4, 5, 6, 8, 9, 10, 12, 13, 16, 17, 18])
在处理非常大的数组时,此循环的计算效率可能会很低。此外,我的目的是最终在没有 scan
操作的情况下在 Theano 中应用它。我想避免使用循环来制作给定向量的切片。
另一个使用 NumPy broadcasting
!
的好设置
A[b[:,None] > np.arange(A.shape[1])]
样本运行
1) 输入:
In [16]: A
Out[16]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
In [17]: b
Out[17]: array([0, 3, 3, 2, 3])
2) 使用广播创建遮罩以供选择:
In [18]: b[:,None] > np.arange(A.shape[1])
Out[18]:
array([[False, False, False, False],
[ True, True, True, False],
[ True, True, True, False],
[ True, True, False, False],
[ True, True, True, False]], dtype=bool)
3) 最后使用 boolean-indexing
选择元素 A
:
In [19]: A[b[:,None] > np.arange(A.shape[1])]
Out[19]: array([ 4, 5, 6, 8, 9, 10, 12, 13, 16, 17, 18])
您可以通过在列表中收集值并只执行一个来加快循环速度 concatenate
:
In [126]: [A[i,:j] for i,j in enumerate(b)]
Out[126]:
[array([], dtype=int32),
array([4, 5, 6]),
array([ 8, 9, 10]),
array([12, 13]),
array([16, 17, 18])]
In [127]: np.concatenate([A[i,:j] for i,j in enumerate(b)])
Out[127]: array([ 4, 5, 6, 8, 9, 10, 12, 13, 16, 17, 18])
假设我有一个大小为 5 x 4 的矩阵 A
,还有一个长度为 5 的向量 b
,其元素表示我在矩阵 [=11 的相应行中需要多少个值=].这意味着 b
中的每个值都以 A
的第二维大小为上限。我的问题是如何在给定向量的情况下对矩阵进行切片,这是通过编写 vector[:n]
例如,这可以通过对 A 的行进行循环来实现:
import numpy
A=numpy.arange(20).reshape((5,4))
b=numpy.array([0, 3, 3, 2, 3])
output=A[0, :b[0]]
for i in xrange(1, A.shape[0]):
output=numpy.concatenate((output, A[i, :b[i]]), axis=0)
# output is array([ 4, 5, 6, 8, 9, 10, 12, 13, 16, 17, 18])
在处理非常大的数组时,此循环的计算效率可能会很低。此外,我的目的是最终在没有 scan
操作的情况下在 Theano 中应用它。我想避免使用循环来制作给定向量的切片。
另一个使用 NumPy broadcasting
!
A[b[:,None] > np.arange(A.shape[1])]
样本运行
1) 输入:
In [16]: A
Out[16]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
In [17]: b
Out[17]: array([0, 3, 3, 2, 3])
2) 使用广播创建遮罩以供选择:
In [18]: b[:,None] > np.arange(A.shape[1])
Out[18]:
array([[False, False, False, False],
[ True, True, True, False],
[ True, True, True, False],
[ True, True, False, False],
[ True, True, True, False]], dtype=bool)
3) 最后使用 boolean-indexing
选择元素 A
:
In [19]: A[b[:,None] > np.arange(A.shape[1])]
Out[19]: array([ 4, 5, 6, 8, 9, 10, 12, 13, 16, 17, 18])
您可以通过在列表中收集值并只执行一个来加快循环速度 concatenate
:
In [126]: [A[i,:j] for i,j in enumerate(b)]
Out[126]:
[array([], dtype=int32),
array([4, 5, 6]),
array([ 8, 9, 10]),
array([12, 13]),
array([16, 17, 18])]
In [127]: np.concatenate([A[i,:j] for i,j in enumerate(b)])
Out[127]: array([ 4, 5, 6, 8, 9, 10, 12, 13, 16, 17, 18])