相关疑难解决方法(0)

是否有NumPy函数返回数组中某些内容的第一个索引?

我知道Python列表有一种方法可以返回第一个索引:

>>> l = [1, 2, 3]
>>> l.index(2)
1
Run Code Online (Sandbox Code Playgroud)

NumPy阵列有类似的东西吗?

python arrays numpy

428
推荐指数
10
解决办法
57万
查看次数

找到第一个np.nan值的最有效方法是什么?

考虑一下阵列 a

a = np.array([3, 3, np.nan, 3, 3, np.nan])
Run Code Online (Sandbox Code Playgroud)

我可以

np.isnan(a).argmax()
Run Code Online (Sandbox Code Playgroud)

但这需要找到所有np.nan只是为了找到第一个.
有更有效的方法吗?


我一直在试图弄清楚我是否可以传递一个参数,np.argpartition使np.nanget首先排序而不是last.


关于[dup]的编辑.
这个问题有几个不同的原因.

  1. 这个问题和答案涉及价值观的平等.这是关于isnan.
  2. 那些答案都遭遇了我的答案面临的同样问题.请注意,我提供了一个完全有效的答案,但强调它的效率低下.我正在寻找解决效率低下的问题.

关于第二次[dup]的编辑.

解决平等和问题/答案仍然很老,很可能已经过时了.

python numpy

13
推荐指数
3
解决办法
915
查看次数

OpenCV:适合检测到的边缘

我通过使用canny边缘检测来检测水波的边缘.但是,我想为这条边拟合一条曲线.这可能在OpenCV中吗?

这是边缘检测前的图像: 边缘检测前的图像.

这是边缘检测操作的结果: 检测结果

代码是从OpenCV教程中的示例复制而来的:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('BW.JPG',0)
edges = cv2.Canny(img,100,200)

plt.plot(1),plt.imshow(edges,cmap = 'gray')
plt.title('WAVE')
plt.show()
Run Code Online (Sandbox Code Playgroud)

python opencv curve-fitting edge-detection

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

用于索引的 R 的 match() 的 Python 等价

所以我本质上想使用 Pandas 数据帧在 Python 中实现 R 的 match() 函数的等价物 - 不使用 for 循环。

在 R match() 中,返回其第二个参数中第一个参数的(第一个)匹配位置的向量。

假设我有两个 df A 和 B,其中都包含 C 列。其中

A$C = c('a','b')
B$C = c('c','c','b','b','c','b','a','a')
Run Code Online (Sandbox Code Playgroud)

在 R 中,我们会得到

match(A$C,B$C) = c(7,3)
Run Code Online (Sandbox Code Playgroud)

什么是 Python 中 Pandas 数据框中列的等效方法,不需要循环遍历值。

python indexing pandas

6
推荐指数
2
解决办法
4391
查看次数

在numpy数组中查找非零之前的零数

我有一个numpy数组A.我希望以非A有效的方式返回非零之前的零数,因为它处于循环中.

如果A = np.array([0,1,2])然后np.nonzero(A)[0][0]返回1.但是如果A = np.array([0,0,0])这不起作用(在这种情况下我想要答案3).而且如果A非常大并且第一个非零值接近开头,这似乎效率低下.

python performance numpy

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

如何优化 NumPy 埃拉托色尼筛?

我在 NumPy 中实现了自己的埃拉托斯特尼筛法。我相信你们都知道它是为了找到一个数字以下的所有素数,所以我不会进一步解释。

\n

代码:

\n
import numpy as np\n\ndef primes_sieve(n):\n    primes = np.ones(n+1, dtype=bool)\n    primes[:2] = False\n    primes[4::2] = False\n    for i in range(3, int(n**0.5)+1, 2):\n        if primes[i]:\n            primes[i*i::i] = False\n\n    return np.where(primes)[0]\n
Run Code Online (Sandbox Code Playgroud)\n

正如你所看到的,我已经做了一些优化,首先除了 2 之外所有素数都是奇数,所以我将 2 的所有倍数设置为False且仅是暴力奇数。

\n

其次,我只循环遍历直到平方根下限的数字,因为平方根之后的所有合数都会因平方根以下素数的倍数而被消除。

\n

但这不是最佳的,因为它循环遍历低于限制的所有奇数,并且并非所有奇数都是质数。随着数字的增大,素数变得更加稀疏,因此存在大量冗余迭代。

\n

因此,如果候选列表是动态更改的,以这样的方式,已经识别的合数甚至不会被迭代,因此只有质数被循环,不会有任何浪费的迭代,因此算法将是最优的。

\n

我写了一个优化版本的粗略实现:

\n
def primes_sieve_opt(n):\n    primes = np.ones(n+1, dtype=bool)\n    primes[:2] = False\n    primes[4::2] = False\n    limit = int(n**0.5)+1\n    i = 2\n    while i < limit:\n        primes[i*i::i] = False\n        i += 1 + …
Run Code Online (Sandbox Code Playgroud)

python primes numpy sieve-of-eratosthenes python-3.x

0
推荐指数
1
解决办法
124
查看次数