Python “根除”中的字符串数组
我有一棵树,它有一根树枝,用来存储字符串。 当我使用Python “根除”中的字符串数组,python,uproot,Python,Uproot,我有一棵树,它有一根树枝,用来存储字符串。 当我使用uproot.open()和arrays()方法阅读时,我得到以下结果: >>> array_train['backtracked_end_process'] <ObjectArray [b'FastScintillation' b'FastScintillation' b'FastScintillation' ... b'FastScintillation' b'FastScintillation' b'FastSci
uproot.open()
和arrays()方法阅读时,我得到以下结果:
>>> array_train['backtracked_end_process']
<ObjectArray [b'FastScintillation' b'FastScintillation' b'FastScintillation' ... b'FastScintillation' b'FastScintillation' b'FastScintillation'] at 0x7f48936e6c90>
有人对如何进行有什么建议吗?能够将它转换为一个numpy.chararray
就已经解决了这个问题,但我不知道如何做到这一点。字符串处理是《根除》中的一个弱点。它使用一个定制的ObjectArray
(甚至不是笨拙数组中的StringArray
),它会根据需要生成字节
对象。您想要的是一个字符串数组类,它的==
重载意味着“比较每个可变长度的字符串,必要时将单个字符串广播到一个数组中。”不幸的是,字符串的根除ObjectArray
和笨拙数组中的StringArray
类都没有做到这一点
所以这里是如何做到这一点的,无可否认,这是通过隐式Pythonfor循环实现的
>导入根除,numpy
>>>f=拔出。打开(“http://scikit-hep.org/uproot/examples/sample-6.10.05-zlib.root")
>>>t=f[“样本”]
>>>t[“str”].array()
>>>数组(列表(t[“str”].array())
数组([b'hey-0',b'hey-1',b'hey-2',b'hey-3',b'hey-4',b'hey-5',
b'hey-6',b'hey-7',b'hey-8',b'hey-9',b'hey-10',b'hey-11',
b'hey-12',b'hey-13',b'hey-14',b'hey-15',b'hey-16',b'hey-17',
b'hey-18',b'hey-19',b'hey-20',b'hey-21',b'hey-22',b'hey-23',
b'hey-24',b'hey-25',b'hey-26',b'hey-27',b'hey-28',b'hey-29'],
数据类型=“| S6”)
>>>numpy.array(list(t[“str”].array())==b“hey-0”
数组([真,假,假,假,假,假,假,假,假,
假,假,假,假,假,假,假,假,假,假,
假,假,假,假,假,假,假,假,假,假,
假,假,假])
循环隐含在列表
构造函数中,该构造函数迭代对象数组
,将每个元素转换为字节
字符串。这个Python列表不适合一次一个数组的操作,因此我们随后构造一个NumPy数组,这是(以填充为代价的)
备选方案,可能更好:
在写这篇文章的时候,我记得Uplot的ObjectArray
是用一个笨拙的JaggedArray
实现的,所以上面的转换可以用JaggedArray
的常规方法来执行,这可能要快得多(没有中间Python字节
对象,没有Python for循环)
>t[“str”].array().regular()
数组([b'hey-0',b'hey-1',b'hey-2',b'hey-3',b'hey-4',b'hey-5',
b'hey-6',b'hey-7',b'hey-8',b'hey-9',b'hey-10',b'hey-11',
b'hey-12',b'hey-13',b'hey-14',b'hey-15',b'hey-16',b'hey-17',
b'hey-18',b'hey-19',b'hey-20',b'hey-21',b'hey-22',b'hey-23',
b'hey-24',b'hey-25',b'hey-26',b'hey-27',b'hey-28',b'hey-29'],
数据类型=对象)
>>>t[“str”].array().regular()==b“hey-0”
数组([真,假,假,假,假,假,假,假,假,
假,假,假,假,假,假,假,假,假,假,
假,假,假,假,假,假,假,假,假,假,
假,假,假])
(上面描述的功能不是有意创建的,但它可以工作,因为正确的片段以一种偶然的方式组成。)字符串处理是“根除”中的一个弱点。它使用一个定制的ObjectArray
(甚至不是笨拙数组中的StringArray
),它会根据需要生成字节
对象。您想要的是一个字符串数组类,它的==
重载意味着“比较每个可变长度的字符串,必要时将单个字符串广播到一个数组中。”不幸的是,字符串的根除ObjectArray
和笨拙数组中的StringArray
类都没有做到这一点
所以这里是如何做到这一点的,无可否认,这是通过隐式Pythonfor循环实现的
>导入根除,numpy
>>>f=拔出。打开(“http://scikit-hep.org/uproot/examples/sample-6.10.05-zlib.root")
>>>t=f[“样本”]
>>>t[“str”].array()
>>>数组(列表(t[“str”].array())
数组([b'hey-0',b'hey-1',b'hey-2',b'hey-3',b'hey-4',b'hey-5',
b'hey-6',b'hey-7',b'hey-8',b'hey-9',b'hey-10',b'hey-11',
b'hey-12',b'hey-13',b'hey-14',b'hey-15',b'hey-16',b'hey-17',
b'hey-18',b'hey-19',b'hey-20',b'hey-21',b'hey-22',b'hey-23',
b'hey-24',b'hey-25',b'hey-26',b'hey-27',b'hey-28',b'hey-29'],
数据类型=“| S6”)
>>>numpy.array(list(t[“str”].array())==b“hey-0”
数组([真,假,假,假,假,假,假,假,假,
假,假,假,假,假,假,假,假,假,假,
假,假,假,假,假,假,假,假,假,假,
假,假,假])
循环隐含在列表
构造函数中,该构造函数迭代对象数组
,将每个元素转换为字节
字符串。这个Python列表不适合一次一个数组的操作,因此我们随后构造一个NumPy数组,这是(以填充为代价的)
备选方案,可能更好:
在写这篇文章的时候,我记得Uplot的ObjectArray
是用一个笨拙的JaggedArray
实现的,所以上面的转换可以用JaggedArray
的常规方法来执行,这可能要快得多(没有中间Python字节
对象,没有Python for循环)
>t[“str”].array().regular()
数组([b'hey-0',b'hey-1',b'hey-2',b'hey-3',b'hey-4',b'hey-5',
b'hey-6',b'hey-7',b'hey-8',b'hey-9',b'hey-10',b'hey-11',
b'hey-12',b'hey-13',b'hey-14',b'hey-15',b'hey-16',b'hey-17',
b'hey-18',b'hey-19',b'hey-20',b'hey-21',b'hey-22',b'hey-23',
b'hey-24',b'hey-25',b'hey-26',b'hey-27',b'hey-28',b'hey-29'],
数据类型=对象)
>>>t[“str”].a
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-97-a28f3706c5b5> in <module>
----> 1 array_train['backtracked_end_process'] == b'FastScintillation'
~/.local/lib/python3.7/site-packages/numpy/lib/mixins.py in func(self, other)
23 if _disables_array_ufunc(other):
24 return NotImplemented
---> 25 return ufunc(self, other)
26 func.__name__ = '__{}__'.format(name)
27 return func
~/.local/lib/python3.7/site-packages/awkward/array/objects.py in __array_ufunc__(self, ufunc, method, *inputs, **kwargs)
216 contents.append(x)
217
--> 218 result = getattr(ufunc, method)(*contents, **kwargs)
219
220 if self._util_iscomparison(ufunc):
~/.local/lib/python3.7/site-packages/awkward/array/jagged.py in __array_ufunc__(self, ufunc, method, *inputs, **kwargs)
987 data = self._util_toarray(inputs[i], inputs[i].dtype)
988 if starts.shape != data.shape:
--> 989 raise ValueError("cannot broadcast JaggedArray of shape {0} with array of shape {1}".format(starts.shape, data.shape))
990
991 if parents is None:
ValueError: cannot broadcast JaggedArray of shape (24035,) with array of shape ()