2024-06-01 02:36:54 发布
网友
我想从两个不同的数组中获取一个新数组(命名为Result),其中:
0 _ 0 => Hold state 1 _ 0 => 1 0 _ 1 => 0 1 _ 1 => 0
示例:
就像是 Latch SR Flip Flop device唯一的区别是1 1 => 0
1 1 => 0
我想用熊猫或纽比。谢谢你的帮助。我写了这一个,它的工作,但它太慢了。
使用DataFrame.merge。这比提供的方法要快得多。在一个由10000个元素组成的数组中,速度大约快50倍。在一个10^6的阵列上,花了220毫秒
In [80]: data = pd.DataFrame({ ....: 'array1': [0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0], ....: 'array2': [0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], ....: }) In [81]: flipflop = pd.DataFrame({ ....: 'array1': [0, 1, 0, 1], ....: 'array2': [0, 0, 1, 1], ....: 'Result': [pd.np.nan, 1, 0, 0] ....: }) In [82]: data.merge(flipflop, how='left', on=['array1', 'array2']).ffill().fillna(0) Out[82]: array1 array2 Result 0 0 0 0 1 0 1 0 2 1 1 0 3 1 0 1 4 0 0 1 5 0 0 1 6 1 0 1 7 0 0 1 8 0 1 0 9 0 0 0 10 0 1 0 11 0 0 0 12 1 0 1 13 0 0 1 In [83]: data = pd.DataFrame({ ....: 'array1': pd.np.random.random_integers(0, 1, 10000), ....: 'array2': pd.np.random.random_integers(0, 1, 10000), ....: }) In [84]: %timeit FLIP(data.array1, data.array2) 10 loops, best of 3: 168 ms per loop In [85]: %timeit data.merge(flipflop, how='left', on=['array1', 'array2']).ffill().fillna(0) 100 loops, best of 3: 2.97 ms per loop
可以使用pandas前向填充函数来避免python循环覆盖数据。在
除了“保持状态”部分,其余基本上是位移位。在
例如:
import pandas as pd array1 = [0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0] array2 = [0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0] expected = [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1] def flip(series1, series2): series1, series2 = pd.Series(series1), pd.Series(series2) out = pd.Series(np.nan, series1.index) out[:] = (series1 >> series2).astype(int) out[(series1 == 0) & (series2 == 0)] = np.nan return out.ffill() print flip(array1, array2).values print expected
请注意,这使起始值未定义。如果您愿意,可以用任何有意义的值(例如0)填充它。在
如果我理解正确,我们可以利用pandas如何处理nan来处理“hold”逻辑:
pandas
nan
def flipper(a1, a2): res = pd.Series(index=a1.index) res.loc[a1 == 1] = 1 res.loc[a2 == 1] = 0 res = res.ffill().fillna(0) return res
这将给出测试用例中的预期结果:
似乎与您的输出基本一致:
from itertools import product def check(): for w in range(1, 9): for a0 in product(range(2), repeat=w): for a1 in product(range(2), repeat=w): s0, s1 = pd.Series(a0), pd.Series(a1) flipper_result = flipper(s0, s1) FLIP_result = FLIP(s0, s1) assert (flipper_result == FLIP_result).all() return True >>> check() True
使用DataFrame.merge。这比提供的方法要快得多。在一个由10000个元素组成的数组中,速度大约快50倍。在一个10^6的阵列上,花了220毫秒
可以使用pandas前向填充函数来避免python循环覆盖数据。在
除了“保持状态”部分,其余基本上是位移位。在
例如:
请注意,这使起始值未定义。如果您愿意,可以用任何有意义的值(例如0)填充它。在
如果我理解正确,我们可以利用
pandas
如何处理nan
来处理“hold”逻辑:这将给出测试用例中的预期结果:
^{pr2}$似乎与您的输出基本一致:
相关问题 更多 >
编程相关推荐