是否有一种原生的numpy方式来转换布尔字符串表示的数组,例如:
['True','False','True','False']
对于我可以用于屏蔽/索引的实际布尔数组?我可以做一个for循环并重建数组,但对于大型数组,这很慢。
答案 0 :(得分:6)
您应该可以进行布尔比较,IIUC,dtype
是字符串还是object
:
>>> a = np.array(['True', 'False', 'True', 'False'])
>>> a
array(['True', 'False', 'True', 'False'],
dtype='|S5')
>>> a == "True"
array([ True, False, True, False], dtype=bool)
或
>>> a = np.array(['True', 'False', 'True', 'False'], dtype=object)
>>> a
array(['True', 'False', 'True', 'False'], dtype=object)
>>> a == "True"
array([ True, False, True, False], dtype=bool)
答案 1 :(得分:2)
我发现了一种比帝斯曼更快的方法,从埃里克那里汲取灵感,尽管最小的价值列表可以看到改善效果。在非常大的值下,迭代本身的成本开始超过在创建numpy数组期间而不是之后执行真值测试的优势。使用is
和==
进行测试(对于字符串被拦截的情况与可能不存在字符串的情况,is
不适用于非实习字符串。作为'True'
可能会成为脚本应该被实习的字面值,但是)表明虽然我的==
版本比is
慢,但它仍然比DSM的版本快得多
测试设置:
import timeit
def timer(statement, count):
return timeit.repeat(statement, "from random import choice;import numpy as np;x = [choice(['True', 'False']) for i in range(%i)]" % count)
>>> stateIs = "y = np.fromiter((e is 'True' for e in x), bool)"
>>> stateEq = "y = np.fromiter((e == 'True' for e in x), bool)"
>>> stateDSM = "y = np.array(x) == 'True'"
对于1000个项目,更快的陈述占DSM时间的66%左右:
>>> timer(stateIs, 1000)
[101.77722641656146, 100.74985342340369, 101.47228618107965]
>>> timer(stateEq, 1000)
[112.26464996250706, 112.50754567379681, 112.76057346127709]
>>> timer(stateDSM, 1000)
[155.67689949529995, 155.96820504501557, 158.32394669279802]
对于较小的字符串数组(数百而不是数千),经过的时间不到DSM的50%:
>>> timer(stateIs, 100)
[11.947757485669172, 11.927990253608186, 12.057855628259858]
>>> timer(stateEq, 100)
[13.064947253943501, 13.161545451986967, 13.30599035623618]
>>> timer(stateDSM, 100)
[31.270060799078237, 30.941749748808434, 31.253922641324607]
当每个列表中有50个项目完成时,DSM超过25%:
>>> timer(stateIs, 50)
[6.856538342483873, 6.741083326021908, 6.708402786859551]
>>> timer(stateEq, 50)
[7.346079345032194, 7.312723444475523, 7.309259899921017]
>>> timer(stateDSM, 50)
[24.154247576229864, 24.173593700599667, 23.946403452288905]
对于5个项目,约占DSM的11%:
>>> timer(stateIs, 5)
[1.8826215278058953, 1.850232652068371, 1.8559381315990322]
>>> timer(stateEq, 5)
[1.9252821868467436, 1.894011299061276, 1.894306935199893]
>>> timer(stateDSM, 5)
[18.060974208809057, 17.916322392367874, 17.8379771602049]
答案 2 :(得分:0)
这还不错吗?
my_list = ['True', 'False', 'True', 'False']
np.array(x == 'True' for x in my_list)
它不是原生的,但如果你是从一个非本地列表开始的话,那真的不重要。