标签: array-broadcasting

获取锯齿状切片的 numpy 简写

我有一个经常做的操作,我称之为“锯齿状切片”,因为我不知道它的真实名称。最好通过例子来解释:

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 没有更好的方法。如果需要,您可以为此创建一个辅助函数。

python arrays indexing numpy array-broadcasting

5
推荐指数
1
解决办法
767
查看次数

两个二维数组的线性插值

在上一个问题(在二维数组上使用 numpy.interp的最快方法)中,有人要求以最快的方式实现以下内容:

np.array([np.interp(X[i], x, Y[i]) for i in range(len(X))])
Run Code Online (Sandbox Code Playgroud)

假设XY是具有多行的矩阵,因此 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几乎可以满足我的要求,但它不使用线性插值...

interpolation numpy scipy array-broadcasting

5
推荐指数
1
解决办法
2232
查看次数

矩阵乘法:将矩阵的每一行乘以 Python 中的另一个二维矩阵

我试图从这个矩阵乘法中删除循环(并了解更多关于一般优化代码的信息),我想我需要某种形式的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)

python numpy matrix numpy-einsum array-broadcasting

5
推荐指数
1
解决办法
1471
查看次数

如何初始化列表对象的Numpy数组

我正在尝试创建一个看起来像的 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)

我该如何解决这个问题?

python numpy array-broadcasting

5
推荐指数
1
解决办法
950
查看次数

涉及放置填充位置的广播问题

介绍

我有一个func可矢量化的函数,我使用np.frompyfunc. for我不想使用嵌套循环,而是只想调用它一次,因此我需要用np.newaxis's填充输入。

我的目标是摆脱两个嵌套for循环并改用numpy.array广播功能。

这是 MWEfor循环(我想摆脱 for 循环,而是填充变量c_0, c_1, rn_1, rn_2,并factor在调用myfunc.

感兴趣问题的 MWE

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)

python numpy vectorization python-3.x array-broadcasting

5
推荐指数
1
解决办法
253
查看次数

如何将向量的每个元素提升为另一个向量的每个元素的幂?

我想通过从 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)

python numpy array-broadcasting

5
推荐指数
2
解决办法
163
查看次数

如何实现 maxpool:在图像或张量上的滑动窗口上取最大值

简而言之:我正在寻找一个简单的numpy(也许是单行的)实现Maxpool- 窗口上numpy.narray跨维度的所有位置的最大窗口。

更详细地说:我正在实现一个卷积神经网络(“CNN”),此类网络中的典型层之一是MaxPool层(例如此处)。写 y = MaxPool(x, S)x是一个输入narrayS是一个参数,使用伪代码,其输出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.narrayx。那x.shape是一个元组(B,H,W,C)。张量经过一层处理后,每个维度的大小都会发生变化,例如层的输入i= 4可以具有大小B …

python numpy neural-network conv-neural-network array-broadcasting

4
推荐指数
1
解决办法
6151
查看次数

Numpy 3d 数组索引

我有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。

python arrays numpy matrix-indexing array-broadcasting

4
推荐指数
1
解决办法
9143
查看次数

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_适用于整数布尔数组。这似乎是因为 …

python arrays indexing numpy array-broadcasting

4
推荐指数
1
解决办法
1812
查看次数

矩阵阵列的克罗内克积

我有两个具有相同形状的矩阵数组 A 和 B:\nA.shape = B.shape = (M,N,P)

\n\n

我想计算沿 0 轴的克罗内克积,以便:

\n\n
KP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有一种方法可以在 numpy 中执行此操作而不使用 for 循环?

\n\n

谢谢!

\n\n

例子:

\n\n
KP[ii,:,:] = A[ii,:,:]\xe2\x8a\x97B[ii,:,:]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这相当于:

\n\n
A = 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               ] )\n
Run Code Online (Sandbox Code Playgroud)\n

numpy python-3.x numpy-ndarray array-broadcasting

4
推荐指数
1
解决办法
918
查看次数