numpy object_数组中最长的字符串

时间:2009-10-17 16:05:57

标签: python arrays numpy

我正在使用numpy object_数组来存储可变长度的字符串,例如

a = np.array(['hello','world','!'],dtype=np.object_)

有没有一种简单的方法可以在不绕过所有元素的情况下找到数组中最长字符串的长度?

5 个答案:

答案 0 :(得分:7)

max(a, key=len)为您提供最长的字符串(len(max(a, key=len))为您提供长度),而不要求您编写显式循环,但当然max将在内部执行自己的循环,如它不可能以任何其他方式识别“最长的字符串”。

答案 1 :(得分:2)

如果将字符串存储在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

答案 2 :(得分:0)

否则每个字符串长度的唯一位置是字符串。所以你必须从每个字符串中找出它的长度。

答案 3 :(得分:0)

假设我想获得第二列中最长的字符串:

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

答案 4 :(得分:0)

我还想提到一个类似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