小编jac*_*cob的帖子

更快的替代numpy.where?

我有一个3d数组,填充从0到N的整数.我需要一个索引列表,对应于数组所在的位置1,2,3,... N.我可以用np.where来完成,如下所示:

N = 300
shape = (1000,1000,10)
data = np.random.randint(0,N+1,shape)
indx = [np.where(data == i_id) for i_id in range(1,data.max()+1)]
Run Code Online (Sandbox Code Playgroud)

但这很慢.根据这个问题 快速python numpy在哪里功能? 应该可以加快索引搜索的速度,但是我无法将那里提出的方法转移到我获取实际索引的问题上.什么是加速上述代码的最佳方法?

作为一个附加组件:我想稍后存储索引,为此有意义的是使用np.ravel_multi_index来减小从保存3个索引到仅1的大小,即使用:

indx = [np.ravel_multi_index(np.where(data == i_id), data.shape) for i_id in range(1, data.max()+1)]
Run Code Online (Sandbox Code Playgroud)

这更接近于Matlab的find函数.这可以直接包含在不使用np.where的解决方案中吗?

python numpy

12
推荐指数
2
解决办法
9201
查看次数

在numpy中更有效地向量化这个卷积类型循环

我必须做以下类型的许多循环

for i in range(len(a)):
    for j in range(i+1):
        c[i] += a[j]*b[i-j]
Run Code Online (Sandbox Code Playgroud)

其中a和b是短阵列(大小相同,大约在10到50之间).这可以使用卷积有效地完成:

import numpy as np
np.convolve(a, b) 
Run Code Online (Sandbox Code Playgroud)

然而,这给了我完整的卷积(即矢量太长,与上面的for循环相比).如果我在convolve中使用'same'选项,我会得到中心部分,但我想要的是第一部分.当然,我可以从完整的向量中删除我不需要的东西,但是如果可能的话我想摆脱不必要的计算时间.有人可以建议更好的循环矢量化吗?

python performance numpy vectorization

7
推荐指数
1
解决办法
1817
查看次数

如何使用`np.fromfile`从二进制文件中读取连续数组?

我想在Python中读取二进制文件,其确切的布局存储在二进制文件本身中.

该文件包含一系列二维数组,每个数组的行和列维度存储为其内容之前的一对整数.我想连续读取文件中包含的所有数组.

我知道这可以用f = open("myfile", "rb")和完成f.read(numberofbytes),但这非常笨拙,因为我需要将输出转换为有意义的数据结构.我想使用numpy的np.fromfile自定义dtype,但没有找到一种方法来读取文件的一部分,让它打开,然后继续阅读修改dtype.

我知道我可以使用osf.seek(numberofbytes, os.SEEK_SET)np.fromfile多次,但是这将在文件中围绕意味着很多不必要的跳跃.

简而言之,我想要MATLAB fread(或者至少像C++这样的东西ifstream read).

做这个的最好方式是什么?

python numpy

6
推荐指数
1
解决办法
845
查看次数

将unicode数组转换为numpy

我有像这样的unicode字符串数组

u'[(12520, 12540), (16600, 16620)]'
Run Code Online (Sandbox Code Playgroud)

并需要将这些转换为numpy数组.甲类似的问题对待已经具有的unicode元件的阵列的问题,但是在我的情况下括号是字符串的一部分.有没有办法直接将其转换为numpy数组(int)而无需手动删除括号?

python unicode numpy

3
推荐指数
1
解决办法
2463
查看次数

Numpy索引:设置由不同数组中的条件给出的数组的值

我想将数组的所有值设置为0,其值不在不同的数组中.

如果它只有一个条件很容易:

a = np.array([[1,2],[2,4],[5,6]])
cond = 1
a[a!=cond] = 0
Run Code Online (Sandbox Code Playgroud)

如果我有一个条件列表怎么样,例如

cond = np.array([1,2,6])
Run Code Online (Sandbox Code Playgroud)

我可以这样写出来

a[(a!=1) & (a!=2) & (a!=6)]=0
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚这样做的一般方法,就像这样

a[a!=cond] = 0
Run Code Online (Sandbox Code Playgroud)

什么时候cond是一个数组.我也看了一下,np.select但似乎没有做我需要的.

python indexing numpy

3
推荐指数
1
解决办法
62
查看次数

是否有numpy.where()等效于行方式操作?

我想找到一些条件的第一次出现的索引,这样它就会返回一个向量.我需要像axis=0条件np.wherepylab find函数一样的东西,但是没有实现.

为了澄清,想象一下我有以下矩阵:

d=np.array([[0,  1, 0, 1], [0, 1, 1, 1], [1, 0, 0, 0], [0,0,0,1]])
Run Code Online (Sandbox Code Playgroud)

我想要第一次出现d==1行.

结果应该是[1, 1, 0, 3],但我没有看到如何np.where有效地使用或任何其他功能.

python numpy scipy

2
推荐指数
1
解决办法
4208
查看次数

python:布尔数组到多边形

我有一个布尔数组,其中包含一个连接的True值组件,我想将其边界转换为多边形,例如在 shapely 中。

假设我的数组是img,我可以得到这样的边界索引

import numpy as np
from skimage.morphology binary_erosion

border_indices = np.transpose(np.nonzero(np.logical_xor(binary_erosion(img), img)))
Run Code Online (Sandbox Code Playgroud)

但是仅仅将它们输入到一个shapely.Polygon对象中是行不通的,因为这些点不是沿着边界排序的,而是按照递增xy值排序的。

可能可以使用 alpha 形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以建议一种更简单的方法来获得边界多边形,最好是直接对原始数组进行操作。

python shapely

2
推荐指数
1
解决办法
1543
查看次数

标签 统计

python ×7

numpy ×6

indexing ×1

performance ×1

scipy ×1

shapely ×1

unicode ×1

vectorization ×1