相关疑难解决方法(0)

为什么矢量化一般比循环更快?

为什么,在硬件执行操作的最低级别和所涉及的一般底层操作(即:运行代码时所有编程语言的实际实现的一般性),矢量化通常比循环更快?

当使用矢量化时,计算机在循环时做了什么(我说的是计算机执行的实际计算,而不是程序员编写的计算),或者它有什么不同的做法?

我一直无法说服自己为什么差异应该如此重要.我可能会说服矢量化代码在某处削减一些循环开销,但计算机仍然必须执行相同数量的操作,不是吗?例如,如果我们将大小为N的向量乘以标量,我们将使用N次乘法执行任一方式,不是吗?

language-agnostic performance vectorization low-level

46
推荐指数
3
解决办法
9057
查看次数

将多个数组与 numpy 数组相交的最佳方法是什么?

假设我有一个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 中的这些项目。我也希望以最有效/最常见的方式做到这一点。

到目前为止我尝试过的解决方案:

  1. X使用排序X.sort()
  2. 使用以下方法查找每个数组的项目位置X

    locations = [np.searchsorted(X, n) for n in A]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 只留下合适的:

    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为 …

python numpy

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

Python遍历灰度图像中的连接组件

我有一个灰度图像,其值介于 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

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

Python Pandas-自上次出现以来在200万行数据框中的分钟

例如,我有以下数据框:

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)

python vectorization dataframe pandas

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

使用.str.replace()vs .replace()更新pandas DataFrame

我的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不是索引.)

谢谢

python dataframe pandas

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