我在几个for循环中多次使用numpy的函数,但它变得太慢了.有没有办法更快地执行此功能?我读过你应该尝试在线循环,以及在for循环之前为函数创建局部变量,但似乎没有什么能提高速度(<1%).在len(UNIQ_IDS)〜800 emiss_data和obj_data有numpy的ndarrays具有形状=(2600,5200).我用import profile得到的瓶颈在哪里手柄,并且where在for循环是一个大的.
import numpy as np
max = np.max
where = np.where
MAX_EMISS = [max(emiss_data[where(obj_data == i)]) for i in UNIQ_IDS)]
Run Code Online (Sandbox Code Playgroud) 假设我用scipy.ndimage.measurements.label标记了一个图像,如下所示:
[[0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 3, 0],
[2, 2, 0, 0, 0, 0],
[2, 2, 0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)
什么是收集属于每个标签的坐标的快速方法?就像这样:
{ 1: [[0, 1], [1, 1], [2, 1]],
2: [[4, 0], [4, 1], [5, 0], [5, 1]],
3: [[3, 4]] }
Run Code Online (Sandbox Code Playgroud)
我正在处理大小约为15,000 x 5000像素的图像,并且每个图像像素的大约一半被标记(即非零).
而不是迭代整个图像nditer,np.where(img == label)为每个标签做一些事情会更快吗?
编辑:
哪种算法最快取决于标记图像的大小与其所具有的标签数量相比.Warren Weckesser和Salvador Dali/BHAT IRSHAD的方法(基于np.nonzero和 …
我有一个包含 0 到 n 值的 2D Numpy 数组。我想获得一个长度为 n 的列表,以便该列表的第 i 个元素是一个包含所有值为 i+1(不包括 0)的索引的数组。
例如,对于输入
array([[1, 0, 1],
[2, 2, 0]])
Run Code Online (Sandbox Code Playgroud)
我期待得到
[array([[0, 0], [0, 2]]), array([[1,0], [1,1]])]
Run Code Online (Sandbox Code Playgroud)
我发现了这个相关的问题: Get a list of重复元素的所有索引在 numpy 数组 中可能会有帮助,但我希望找到一个更直接的解决方案,不需要对数组进行展平和排序,并且尽可能高效.