我有一个经常做的操作,我称之为“锯齿状切片”,因为我不知道它的真实名称。最好通过例子来解释:
a = np.random.randn(50, 10)
entries_of_interest = np.random.randint(10, size = 50) # Vector of 50 indices between 0 and 9
# Now I want the values contained in each row of a at the corresponding index in "entries of interest"
jagged_slice_of_a = a[np.arange(a.shape[0]), entries_of_interest]
# jagged_slice_of_a is now a vector with 50 elements. Good.
Run Code Online (Sandbox Code Playgroud)
唯一的问题是执行此a[np.arange(a.shape[0]), entries_of_interest]索引有点麻烦(为此而必须构造“np.arange(a.shape[0])”似乎很愚蠢)。我想要类似:操作员的东西,但它:会做其他事情。有没有更简洁的方法来执行此操作?
不,原生 numpy 没有更好的方法。如果需要,您可以为此创建一个辅助函数。
在上一个问题(在二维数组上使用 numpy.interp的最快方法)中,有人要求以最快的方式实现以下内容:
np.array([np.interp(X[i], x, Y[i]) for i in range(len(X))])
Run Code Online (Sandbox Code Playgroud)
假设X和Y是具有多行的矩阵,因此 for 循环代价高昂。在这种情况下有一个很好的解决方案可以避免 for 循环(请参阅上面的链接答案)。
我面临着一个非常相似的问题,但我不清楚在这种情况下是否可以避免 for 循环:
np.array([np.interp(x, X[i], Y[i]) for i in range(len(X))])
Run Code Online (Sandbox Code Playgroud)
换句话说,我想使用线性插值对存储在两个矩阵X和的行中的大量信号进行上采样Y。我希望在 numpy 或 scipy (scipy.interpolate.interp1d) 中找到一个通过广播语义支持此操作的函数,但到目前为止我似乎找不到一个。
其他要点:
如果有帮助,行X[i]和x已在我的应用程序中预先排序。此外,就我而言,len(x)它比len(X[i]).
该函数scipy.signal.resample几乎可以满足我的要求,但它不使用线性插值...
我试图从这个矩阵乘法中删除循环(并了解更多关于一般优化代码的信息),我想我需要某种形式的np.broadcastingor np.einsum,但是在阅读它们之后,我仍然不确定如何使用它们我的问题。
A = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11,12,13,14,15]])
#A is a 3x5 matrix, such that the shape of A is (3, 5) (and A[0] is (5,))
B = np.array([[1,0,0],
[0,2,0],
[0,0,3]])
#B is a 3x3 (diagonal) matrix, with a shape of (3, 3)
C = np.zeros(5)
for i in range(5):
C[i] = np.linalg.multi_dot([A[:,i].T, B, A[:,i]])
#Each row of matrix math is [1x3]*[3x3]*[3x1] to become a scaler value in each row …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个看起来像的 numpy 数组
array([[list([]), list([])],
[list([]), list([])],
[list([]), list([])]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
该数组具有 shape (3,2)。然而,每当我这样做
np.array([[list(), list()], [list(), list()], [list(), list()]])
Run Code Online (Sandbox Code Playgroud)
我最终得到
array([], shape=(3, 2, 0), dtype=float64)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我有一个func可矢量化的函数,我使用np.frompyfunc. for我不想使用嵌套循环,而是只想调用它一次,因此我需要用np.newaxis's填充输入。
我的目标是摆脱两个嵌套for循环并改用numpy.array广播功能。
这是 MWEfor循环(我想摆脱 for 循环,而是填充变量c_0, c_1, rn_1, rn_2,并factor在调用myfunc.
for i, b_0 in enumerate(b_00):
for j, b_1 in enumerate(b_11):
factor = b_0 + b_1
rn = (b_0 * coord + b_1 * coord2) / factor
rn_1 = coord - rn
rn_2 = coord2 - rn
results = np.add( results,np.prod(myfunc(c_0[:,None,:], c_1[None,:,:], rn_1, rn_2, factor), axis=2) …Run Code Online (Sandbox Code Playgroud) 我想通过从 0 到 5 的递增幂来提高向量:
import numpy as np
a = np.array([1, 2, 3]) # list of 11 components
b = np.array([0, 1, 2, 3, 4]) # power
c = np.power(a,b)
Run Code Online (Sandbox Code Playgroud)
期望的结果是:
c = [[1**0, 1**1, 1**2, 1**3, 1**4], [2**0, 2**1, ...], ...]
Run Code Online (Sandbox Code Playgroud)
我不断收到此错误:
ValueError: operands could not be broadcast together with shapes (3,) (5,)
Run Code Online (Sandbox Code Playgroud) 简而言之:我正在寻找一个简单的numpy(也许是单行的)实现Maxpool- 窗口上numpy.narray跨维度的所有位置的最大窗口。
更详细地说:我正在实现一个卷积神经网络(“CNN”),此类网络中的典型层之一是MaxPool层(例如此处)。写
y = MaxPool(x, S),x是一个输入narray,S是一个参数,使用伪代码,其输出MaxPool由下式给出:
y[b,h,w,c] = max(x[b, s*h + i, s*w + j, c]) over i = 0,..., S-1; j = 0,...,S-1.
Run Code Online (Sandbox Code Playgroud)
也就是说,y如果narray索引处的值等于沿着输入的第二维和第三维大小的b,h,w,c窗口所取的最大值,则窗口“角”被放置在索引处。S x Sxb,h,w,c
一些其他细节:网络是使用numpy. CNN 有许多“层”,其中一层的输出是下一层的输入。层的输入numpy.narray称为“张量”。就我而言,张量是 4 维的numpy.narray,x。那x.shape是一个元组(B,H,W,C)。张量经过一层处理后,每个维度的大小都会发生变化,例如层的输入i= 4可以具有大小B …
python numpy neural-network conv-neural-network array-broadcasting
我有3D numpy的阵列(N_SAMPLES次X num_components×2在下面的示例)N_SAMPLES次= 5和num_components = 7。
我有另一个数组(索引),它是每个形状(n_samples,)的样本的选定组件。
我想从给定索引的数据数组中进行选择,以便结果数组为n_samples x 2。
代码如下:
import numpy as np
np.random.seed(77)
data=np.random.randint(low=0, high=10, size=(5, 7, 2))
indices = np.array([0, 1, 6, 4, 5])
#how can I select indices from the data array?
Run Code Online (Sandbox Code Playgroud)
例如,对于数据 0,所选组件应为第 0,对于数据 1,所选组件应为 1。
请注意,我不能使用任何 for 循环,因为我在 Theano 中使用它,并且解决方案应该完全基于 numpy。
与此问题相关,我通过布尔数组和广播遇到了索引行为,我不明白。我们知道可以使用整数索引和广播在 2 维中索引 NumPy 数组。这是在文档中指定的:
a = np.array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
b1 = np.array([False, True, True])
b2 = np.array([True, False, True, False])
c1 = np.where(b1)[0] # i.e. [1, 2]
c2 = np.where(b2)[0] # i.e. [0, 2]
a[c1[:, np.newaxis], c2] # or a[c1[:, None], c2]
array([[ 4, 6],
[ 8, 10]])
Run Code Online (Sandbox Code Playgroud)
但是,这同样不适用于布尔数组。
a[b1[:, None], b2]
IndexError: too many indices for array
Run Code Online (Sandbox Code Playgroud)
替代方案numpy.ix_适用于整数和布尔数组。这似乎是因为 …
我有两个具有相同形状的矩阵数组 A 和 B:\nA.shape = B.shape = (M,N,P)
\n\n我想计算沿 0 轴的克罗内克积,以便:
\n\nKP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\nRun Code Online (Sandbox Code Playgroud)\n\n有没有一种方法可以在 numpy 中执行此操作而不使用 for 循环?
\n\n谢谢!
\n\n例子:
\n\nKP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\nRun Code Online (Sandbox Code Playgroud)\n\n这相当于:
\n\nA = np.array([ [[1,0],\n [0,1]],\n [[1,0],\n [0,1]]\n ])\n\nB = np.array([ [[1,0],\n [0,-1]],\n [[0,1],\n [1,0]]\n ])\n\nKP = np.array( [\n [[1,0,0,0],\n [0,-1,0,0],\n [0,0,1,0],\n [0,0,0,-1]],\n [[0,1,0,0],\n [1,0,0,0],\n [0,0,0,1],\n [0,0,1,0]]\n ] )\nRun Code Online (Sandbox Code Playgroud)\n