python-3.x 如何检查一个数组是否包含所有0个元素?

7rfyedvj  于 12个月前  发布在  Python
关注(0)|答案(5)|浏览(135)

我知道一种方法是遍历所有列,例如,

for col in df.columns:
  assert (df[col] != 0).sum() == 0

字符串
有没有更好的方法可以在整个框架上操作,而不需要循环遍历每个单独的列?

u59ebvdq

u59ebvdq1#

出于好奇,我测试了这里给出的答案中的方法,我在StackOverflow的其他地方发现了类似的问题。下面是方法:

funcs = { 
    'tdelaney' : lambda df:not df.any(axis=None),
    'Goku 1'   : lambda df:(df == 0).all(axis=None),
    'Goku 2'   : lambda df:all((df == 0).all()),
    'kevin41'  : lambda df:(0 == df.to_numpy()).all(),
    'other 1'  : lambda df:not np.any(df),
    'other 2'  : lambda df:(df != 0).sum().sum() == 0,
    'other 3'  : lambda df:(df != 0).any(axis=None)
}

字符串
为了测试,我使用了一个1000行1000列的点阵,其中所有的列都是零,另外三个1的值分别为[1,1][499,499][999,999]

N = 1000
df0 = pd.DataFrame(np.zeros([N,N]))
df_low = pd.DataFrame(np.zeros([N,N]))
df_mid = pd.DataFrame(np.zeros([N,N]))
df_high = pd.DataFrame(np.zeros([N,N]))
df_low.loc[1, 1] = 1
df_mid.loc[N//2-1, N//2-1] = 1
df_high.loc[N-1, N-1] = 1


然后,我在一个循环中迭代了函数和嵌套(打印只是为了为SO做表格标记):

for name, func in funcs.items():
    print(f'| {name} ', end='')
    for df in dfs.values():
        time = timeit.timeit(setup='import pandas as pd, numpy as np', stmt='res = func(df)',number=1000,globals=locals())
        print(f'| {time:.3f} ', end='')
    print('|')


结果如下:
| 方法|零|低|中期|高|
| --|--|--|--|--|
| 特德莱尼|0.846|八四○|零点八三|零点八五四|
| 悟空1| 0.331| 0.321|零点三一六|零点三一三|
| 悟空2|零点三二|0.299| 0.309| 0.326|
| kevin41| 0.139|零点一四|零点一四五|零点一三八|
| 其他1|八百|零七八零|0.784|七九零|
| 其他2| 0.821| 0.818|零点八一六|0.842|
| 其他3| 0.325|零点三一五|0.312|零点三一四|
可以看出,kevin 41给出的答案是- * 对于这个样本数据 * -比次优解快两倍多。之后,小悟空的解决方案和“其他3”解决方案彼此差不多,最后三个解决方案比那些解决方案慢2.5倍。
有趣的是,df_lowdf_high的时间对于每种方法都是一致的,这表明没有发生短路。

mbzjlibv

mbzjlibv2#

这个函数将返回True如果所有的值在一个df是0和False如果不是。

def is_zero(df):
    vals = df.to_numpy()
    return (0 == vals).all()

字符串

kfgdxczn

kfgdxczn3#

@Mark评论道:
你可以试试:

(df == 0).all()

#output
Col_1    True
Col_2    True
dtype: bool

字符串
它将给予单个列的结果,如Col_1都是0; Col_2都是0
如果您这样做:

(df == 0).all(axis=None)


它将给予整个 Dataframe
您还可以:

all((df == 0).all())

nimxete2

nimxete24#

看看这个:
df.isin([0]).sum()

krugob8w

krugob8w5#

你可以检查是否有不为0的值,然后取反。使用嵌套框架的.any方法和轴None来检查所有值。这应该在第一个非零值上停止,这比sumdf == 0更好,这将构建一个全新的系列或嵌套框架。

not df.any(axis=None)

字符串

相关问题