除了写循环还有什么更好的办法

2018-05-21 18:49:15 +08:00
 songdg
要验证 b 是否在 a 中,除了写循环还有什么更好的办法?
a = array([False, False, False, True, True, True, False, False, False, False, False, False])
b = array([True, True, True])
i = 0
while True:
if np.all(b == a[i:i+3]) == True:
print('match')
break
i += 1
else:
print('no match')
5009 次点击
所在节点    Python
37 条回复
rabbbit
2018-05-22 01:05:42 +08:00
我想到的是''.join(map(str, b)) in ''.join(map(str, a))
看了下评论,为什么说 1 楼的代码是错的?
noli
2018-05-22 04:54:38 +08:00
false 为 0
True 为 1
bool 数组转换为整型数之后,判断以 b 为模余数是否为 0
就可以了
locktionc
2018-05-22 07:08:02 +08:00
楼上这这些人,你们怎么一根筋不知道变通?

```
import numpy as np

a = np.array([False, False, False, True, True, True, False, False, False, False, False, False])
b = np.array([True, True, True])
if str(b)[1:-1] in str(a):
print('b 在 a 中')
```
boboliu
2018-05-22 07:15:41 +08:00
@locktionc 哈哈哈,这操作很骚…
Binb
2018-05-22 07:56:43 +08:00
用字符串匹配喽
lastpass
2018-05-22 08:33:38 +08:00
吓得我赶紧去翻了一下编译原理,这就是最简单的有穷自动机呀。
PythonAnswer
2018-05-22 08:36:12 +08:00
Map reduce filter
clearCode1124
2018-05-22 08:46:26 +08:00
sets.difference()
ipwx
2018-05-22 09:52:15 +08:00
@locktionc 如果不是 bool,这招就不管用了
xxxy
2018-05-22 10:31:34 +08:00
楼上说了,用 kmp 可以实现
Raymon111111
2018-05-22 10:47:06 +08:00
不就是最长公共子序列吗
congeec
2018-05-22 10:50:55 +08:00
@ipwx 老哥这些 gist 里的注释和 doc test 都是你手写的么?

@locktionc 大胸弟你这样会被打死的
ipwx
2018-05-22 10:58:31 +08:00
@congeec 这个 gist 不是我写的,是我见过的写得最好的 rolling_window。

我昨天写的 np.max 其实还不太妥当。用 np.any 其实就够了:

is_matched = np.any(np.equal(np.sum(needle, axis=-1), l).astype(np.bool))
locktionc
2018-05-22 11:07:41 +08:00
@ipwx 也管用。
ipwx
2018-05-22 11:12:13 +08:00
@locktionc 浮点数的话,要用 (a-b) < eps,就用不了你这方法了。

@congeec 上面的 astype(np.bool) 似乎不必要。
lolizeppelin
2018-05-22 12:16:26 +08:00
转 set b-a
songdg
2018-05-23 05:56:50 +08:00
谢谢各位热心的 v2exer。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/456605

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX