我正在使用一个 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