使用python的2个不同数组拖动值(simil触发器)

2024-06-01 02:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从两个不同的数组中获取一个新数组(命名为Result),其中:

0 _ 0 => Hold state
1 _ 0 => 1
0 _ 1 => 0
1 _ 1 => 0

示例:

^{pr2}$

就像是 Latch SR Flip Flop device唯一的区别是1 1 => 0

我想用熊猫或纽比。谢谢你的帮助。我写了这一个,它的工作,但它太慢了。

^{3}$

Tags: 示例device数组result命名state区别sr
3条回答

使用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”逻辑:

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

这将给出测试用例中的预期结果:

^{pr2}$

似乎与您的输出基本一致:

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

相关问题 更多 >