我们用零填充numpy数组如下:
np.zeros((N,N+1))
Run Code Online (Sandbox Code Playgroud)
但是我们如何检查给定n*n numpy数组矩阵中的所有元素是否为零.
如果所有值都为零,则该方法只需返回True.
我正在寻找一种最有效的方法来确定一个大型数组是否包含至少一个非零值.乍一看np.any似乎是这项工作的明显工具,但对大型阵列来说似乎意外地缓慢.
考虑这种极端情况:
first = np.zeros(1E3,dtype=np.bool)
last = np.zeros(1E3,dtype=np.bool)
first[0] = True
last[-1] = True
# test 1
%timeit np.any(first)
>>> 100000 loops, best of 3: 6.36 us per loop
# test 2
%timeit np.any(last)
>>> 100000 loops, best of 3: 6.95 us per loop
Run Code Online (Sandbox Code Playgroud)
至少np.any在这里似乎做了一些模糊的事情 - 如果非零值是数组中的第一个True,那么在返回之前不应该考虑任何其他值,所以我希望测试1比测试2稍快一些.
但是,当我们使阵列更大时会发生什么?
first = np.zeros(1E9,dtype=np.bool)
last = np.zeros(1E9,dtype=np.bool)
first[0] = True
last[-1] = True
# test 3
%timeit np.any(first)
>>> 10 loops, best of 3: 21.6 ms per …Run Code Online (Sandbox Code Playgroud) 考虑一下阵列 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]的编辑.
这个问题有几个不同的原因.
isnan.关于第二次[dup]的编辑.
解决平等和问题/答案仍然很老,很可能已经过时了.
一个 n 维数组有 2n 个边(一个一维数组有 2 个端点;一个二维数组有 4 个边或边;一个 3 维数组有 6 个二维面;一个 4 维数组有 8 个边;等等。)。这类似于抽象的 n 维立方体所发生的情况。
我想检查一个 n 维数组的所有边是否只由零组成。以下是边由零组成的数组的三个示例:
# 1D
np.array([0,1,2,3,0])
# 2D
np.array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 2, 3, 0],
[0, 0, 1, 0],
[0, 0, 0, 0]])
# 3D
np.array([[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 1, 2, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 0, 0, …Run Code Online (Sandbox Code Playgroud) 我有一个df带有很长的随机正整数列的数据帧:
df = pd.DataFrame({'n': np.random.randint(1, 10, size = 10000)})
Run Code Online (Sandbox Code Playgroud)
我想确定列中第一个偶数的索引.一种方法是:
df[df.n % 2 == 0].iloc[0]
Run Code Online (Sandbox Code Playgroud)
但这涉及很多操作(生成指数f.n % 2 == 0,评估df这些指数,最后采取第一项)并且非常缓慢.像这样的循环要快得多:
for j in range(len(df)):
if df.n.iloc[j] % 2 == 0:
break
Run Code Online (Sandbox Code Playgroud)
也因为第一个结果可能在前几行.是否有任何pandas方法以相似的性能执行此操作?谢谢.
注意:这个条件(是一个偶数)只是一个例子. 我正在寻找适用于价值观的任何条件的解决方案,即快速单线替代:
df[ conditions on df.n ].iloc[0]
Run Code Online (Sandbox Code Playgroud) 假设我有一堆数组,包括x和y,我想检查它们是否相等.一般来说,我可以使用np.all(x == y)(除非我现在忽略了一些愚蠢的角落案例).
但是,这会评估整个数组(x == y),这通常是不需要的.我的阵列是真的大了,我有很多的人,和两个数组是相等的小,所以在所有的可能性,我真的只需要评估的一个非常小的一部分的可能性(x == y)之前,all函数可以返回False,所以这对我来说不是最佳解决方案.
我尝试过使用内置all函数,结合itertools.izip:all(val1==val2 for val1,val2 in itertools.izip(x, y))
不过,这似乎只是在两个数组的情况下慢得多是相等的,即总体而言,它使用过的STIL不值得np.all.我认为是因为内置all的一般目的.而且np.all不会对发电机工作.
有没有办法以更快的方式做我想要的事情?
我知道这个问题类似于先前提出的问题(例如,比较两个numpy数组的相等性,元素方面),但它们没有特别涵盖提前终止的情况.