【发布时间】:2010-12-07 15:21:25
【问题描述】:
我正在使用一个 numpy object_ 数组来存储可变长度的字符串,例如
a = np.array(['hello','world','!'],dtype=np.object_)
有没有一种简单的方法可以在不遍历所有元素的情况下找到数组中最长字符串的长度?
【问题讨论】:
我正在使用一个 numpy object_ 数组来存储可变长度的字符串,例如
a = np.array(['hello','world','!'],dtype=np.object_)
有没有一种简单的方法可以在不遍历所有元素的情况下找到数组中最长字符串的长度?
【问题讨论】:
max(a, key=len) 给你最长的字符串(len(max(a, key=len)) 给你它的长度)而不需要你编写一个显式循环,但当然max 会在内部进行自己的循环,因为它不可能识别任何其他方式的“最长的字符串”。
【讨论】:
如果您将字符串存储在 dtype 对象的 numpy 数组中,那么您无法在不循环的情况下获得对象(字符串)的大小。但是,如果您让 np.array 决定 dtype,那么您可以通过查看 dtype 找出最长字符串的长度:
In [64]: a = np.array(['hello','world','!','Oooh gaaah booo gaah?'])
In [65]: a.dtype
Out[65]: dtype('|S21')
In [72]: a.dtype.itemsize
Out[72]: 21
【讨论】:
不,因为每个字符串的长度唯一知道的地方是字符串。所以你必须从每个字符串中找出它的长度是多少。
【讨论】:
假设我想在第二列中获取最长的字符串:
data_array = [['BFNN' 'Forested bog without permafrost or patterning, no internal lawns']
['BONS' 'Nonpatterned, open, shrub-dominated bog']]
def get_max_len_column_value(data_array, column):
return len(max(data_array[:,[column]], key=len)[0])
get_max_len_column_value(data_array, 1)
>>>64
【讨论】:
我还要提一个类似 C 的方法:
int(string_array.dtype.itemsize/np.dtype(string_array.dtype.char+'1').itemsize)
似乎比公认的答案更有效率:
codes_len = 10000
codes_size = 10000
string_array = np.random.choice(np.array([b'a', b'b']), [codes_size, codes_len])
string_array = np.array([b"".join(string_array[i]).decode('utf-8') for i in range(codes_size)])
%time res = int(string_array.dtype.itemsize/np.dtype(string_array.dtype.char+'1').itemsize)
print('result is:', str(res) + '\n')
>>> CPU times: user 21 µs, sys: 4 µs, total: 25 µs
>>> Wall time: 29.1 µs
>>> result is: 10000
%time res = len(max(string_array, key=len))
print('result is:', res)
>>> CPU times: user 333 ms, sys: 8.21 ms, total: 342 ms
>>> Wall time: 341 ms
>>> result is: 10000
【讨论】: