我有一个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的解决方案中吗?
我必须做以下类型的许多循环
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中读取二进制文件,其确切的布局存储在二进制文件本身中.
该文件包含一系列二维数组,每个数组的行和列维度存储为其内容之前的一对整数.我想连续读取文件中包含的所有数组.
我知道这可以用f = open("myfile", "rb")和完成f.read(numberofbytes),但这非常笨拙,因为我需要将输出转换为有意义的数据结构.我想使用numpy的np.fromfile自定义dtype,但没有找到一种方法来读取文件的一部分,让它打开,然后继续阅读修改dtype.
我知道我可以使用os到f.seek(numberofbytes, os.SEEK_SET)和np.fromfile多次,但是这将在文件中围绕意味着很多不必要的跳跃.
简而言之,我想要MATLAB fread(或者至少像C++这样的东西ifstream read).
做这个的最好方式是什么?
我有像这样的unicode字符串数组
u'[(12520, 12540), (16600, 16620)]'
Run Code Online (Sandbox Code Playgroud)
并需要将这些转换为numpy数组.甲类似的问题对待已经具有的unicode元件的阵列的问题,但是在我的情况下括号是字符串的一部分.有没有办法直接将其转换为numpy数组(int)而无需手动删除括号?
我想将数组的所有值设置为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但似乎没有做我需要的.
我想找到一些条件的第一次出现的索引,这样它就会返回一个向量.我需要像axis=0条件np.where或pylab 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有效地使用或任何其他功能.
我有一个布尔数组,其中包含一个连接的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对象中是行不通的,因为这些点不是沿着边界排序的,而是按照递增x和y值排序的。
可能可以使用 alpha 形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以建议一种更简单的方法来获得边界多边形,最好是直接对原始数组进行操作。