我有两个数组,看起来像这样:
arr1 = [0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1
1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0
1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0]
arr2 = [0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0
0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1
0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0]
字符串
1.比较两个数组的最快方法是什么?如果两个数组在相同的位置都有“1”,找出哪个数组有最接近的“0”,并将该数组中的“1”替换为“0”。
1.用“0”替换数组中后跟“1”的所有“1“。
我使用迭代解决了这个问题,但我相信在numpy
或pandas
中有一个简单且更快的解决方案,我才刚刚开始学习。
这里有一个使用迭代解决第一个问题的丑陋示例:
df = pd.DataFrame({"A": arr1, "B": arr2, })
df2 = df[(df.A > 0) & (df.B > 0)]
i = 1
for idx in df2.index:
while df.loc[idx, 'A'] == 1 and df.loc[idx, 'B'] == 1:
try:
if df.loc[idx - i, 'A'] > 0 or df.loc[idx - i, 'B'] > 0:
df.loc[idx, 'A'] = df.loc[idx - i, 'A']
df.loc[idx, 'B'] = df.loc[idx - i, 'B']
else:
i += 1
except KeyError:
df.loc[idx, 'A'] = 0
df.loc[idx, 'B'] = 0
型
这是第二个问题的解决方案:
df2 = df[(df.A > 0)].A
for idx in df2.index:
if df.loc[idx + 1, 'A'] > 0:
df.loc[idx, 'A'] = 0
df2 = df[(df.B > 0)].B
for idx in df2.index:
if df.loc[idx + 1, 'B'] > 0:
df.loc[idx, 'B'] = 0
型
现在做Pandas巫毒教,使它成为一个单一的行。
4条答案
按热度按时间pftdvrlh1#
使用numpy,你可以做以下事情:
字符串
第二部分:
型
dgtucam12#
我不确定使用numpy内置函数是否有更好的解决方案,但你肯定不需要子列表来解决这个问题。
下面是我的算法1:
字符串
总而言之,查看两个列表,比较数组之间的值,当你在同一个索引中发现两个1时,向后循环以找出要替换的。
您只需要比较每个算法的值对。
第二个算法非常简单,只需要向后循环,如果相邻的两个索引都包含1,就用0替换后者。
型
将func1然后func2应用于给定的示例数组后的输出:
型
8iwquhpp3#
如果没有一个简单、可重复的示例(输入和所需的输出),很难解释您的条件。
歧义的一个来源是当你说:
(...)找出哪一个数组具有向后看的最接近的“0”,并将该数组中的“1”替换为“0”。
这是否意味着这个新插入的
0
现在可以用于将来确定“向后看最近的0
”?如果是这样,则可能无法找到矢量化的解决方案。另一方面,如果您认为输入是不可变的,并且希望根据输入中
0
的接近性将一些1
更改为0
来制作修改的副本,则您可能需要以下内容:字符串
简单输入示例:
型
这是如何工作的?
第一部分
zdist
计算到任何1
左侧最近的0
的距离。例如:型
第二部分(函数
f
),p
是乘积,并且只有在a
和b
都是1
的情况下才是1
。那么,i
是两个数组都是1
的索引。而sel
是一个选择器,它基于哪个数组具有最接近的0
:(0: a
,1: b
)的最大值。结果是
p, new_a, new_b
的元组(原始的a
和b
未被修改)。对于第二个问题:
型
yzxexxkh4#
尝试使用numpy方法为您的条件。我认为应该进一步寻找如何从后面找到索引为0
字符串