为什么,在硬件执行操作的最低级别和所涉及的一般底层操作(即:运行代码时所有编程语言的实际实现的一般性),矢量化通常比循环更快?
当使用矢量化时,计算机在循环时做了什么(我说的是计算机执行的实际计算,而不是程序员编写的计算),或者它有什么不同的做法?
我一直无法说服自己为什么差异应该如此重要.我可能会说服矢量化代码在某处削减一些循环开销,但计算机仍然必须执行相同数量的操作,不是吗?例如,如果我们将大小为N的向量乘以标量,我们将使用N次乘法执行任一方式,不是吗?
假设我有一个numpy数组的例子:
import numpy as np
X = np.array([2,5,0,4,3,1])
Run Code Online (Sandbox Code Playgroud)
我还有一个数组列表,例如:
A = [np.array([-2,0,2]), np.array([0,1,2,3,4,5]), np.array([2,5,4,6])]
Run Code Online (Sandbox Code Playgroud)
我只想保留每个列表中也在 X 中的这些项目。我也希望以最有效/最常见的方式做到这一点。
到目前为止我尝试过的解决方案:
X使用排序X.sort()。使用以下方法查找每个数组的项目位置X:
locations = [np.searchsorted(X, n) for n in A]
Run Code Online (Sandbox Code Playgroud)只留下合适的:
masks = [X[locations[i]] == A[i] for i in range(len(A))]
result = [A[i][masks[i]] for i in range(len(A))]
Run Code Online (Sandbox Code Playgroud)但它不起作用,因为第三个数组的位置超出范围:
locations = [array([0, 0, 2], dtype=int64), array([0, 1, 2, 3, 4, 5], dtype=int64), array([2, 5, 4, 6], dtype=int64)]
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
我最终得到了idx[idx==len(Xs)] = 0解决方案。我还注意到答案之间发布了两种不同的方法:转换X为 …
我有一个灰度图像,其值介于 0(黑色)和白色(255)之间。我有一个target与灰度图像大小相同的矩阵。我需要从灰度图像中的一个随机像素开始,一次遍历图像一个像素(以深度优先搜索方式),将其值复制到target矩阵中的相应位置。我显然只需要对非白色像素执行此操作。我怎样才能做到这一点?本以为可以得到灰度图像的连通分量,将每个像素点一个一个地遍历,但是找不到合适的连通分量的实现。有任何想法吗?
例如,如果我的灰度图像是:
[[255,255,255,255,255,255,255]
[255,255, 0 ,10 ,255,255, 1 ]
[255,30 ,255,255,50 ,255, 9 ]
[51 ,20 ,255,255, 9 ,255,240]
[255,255,80 ,50 ,170,255, 20]
[255,255,255,255,255,255, 0 ]
[255,255,255,255,255,255, 69]]
Run Code Online (Sandbox Code Playgroud)
然后可能的遍历[0,10,50,9,170,50,80,20,51,30]后跟[1,9,240,20,0,69]to give [0,10,50,9,170,50,80,20,51,30,1,9,240,20,0,69]。不同对象之间的顺序无关紧要。
其他可能的遍历是:
[1,9,240,20,0,69,0,10,50,9,170,50,80,20,51,30]或[1,9,240,20,0,69,0,10,50,9,170,50,80,20,30,51]或
[1,9,240,20,0,69,10,50,9,170,50,80,20,30,0,51]
等等。
python numpy image python-imaging-library connected-components
例如,我有以下数据框:
Date indicator_1 indicator_2
2013-04-01 03:50:00 x w
2013-04-01 04:00:00 y u
2013-04-01 04:15:00 z v
2013-04-01 04:25:00 x w
2013-04-01 04:25:00 z u
2013-04-01 04:30:00 y u
2013-04-01 04:35:00 y w
2013-04-01 04:40:00 z w
2013-04-01 04:40:00 x u
2013-04-01 04:40:00 y v
2013-04-01 04:50:00 x w
Run Code Online (Sandbox Code Playgroud)
我的目标是使用以下规则创建两列:
第一栏应该告诉我自上次在indicator_1栏上出现“ x”以来的分钟数。
第二列应提供自上次在指标_1上出现对“ y”和在指标_2列上出现“ u”以来的分钟数。
对于具有完全相同的小时且其中一个时间与“ x”(在第一种情况下)或对“ y”,“ u”(在第二种情况下)相对应的行,计算分钟数应针对变量的先前出现进行。因此,所需的输出应类似于:
Date desired_column_1 desired_column_2 indicator_1 indicator_2
2013-04-01 03:50:00 NaN NaN x w
2013-04-01 04:00:00 10.0 NaN y u
2013-04-01 04:15:00 25.0 15.0 z …Run Code Online (Sandbox Code Playgroud) 我的pandas Dataframe df中有一个列,其中包含一些字符串,其中包含一些尾随的十六进制编码的NULL(\ x00).至少我认为就是这样.当我尝试用以下内容替换它们时:
df['SOPInstanceUID'] = df['SOPInstanceUID'].replace('\x00', '')
Run Code Online (Sandbox Code Playgroud)
该列未更新.当我这样做的时候
df['SOPInstanceUID'] = df['SOPInstanceUID'].str.replace('\x00', '')
Run Code Online (Sandbox Code Playgroud)
它工作正常.这有什么区别?(SOPInstanceUID不是索引.)
谢谢