7
votes

La plus longue chaîne dans Numpy Object_ Array

J'utilise un tableau d'objet numpy pour stocker des chaînes de longueur variable, par exemple

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


0 commentaires

5 Réponses :


0
votes

Non comme le seul endroit où la longueur de chaque chaîne est connue est par la chaîne. Vous devez donc découvrir à chaque chaîne quelle est sa longueur.


0 commentaires

5
votes

Si vous stockez la chaîne dans une matrice numpue d'objet DTYPE, vous ne pouvez pas obtenir à la taille des objets (chaînes) sans boucle. Toutefois, si vous laissez NP.Array décider du dtype, vous pouvez découvrir la longueur de la chaîne la plus longue en regardant sur 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


0 commentaires

9
votes

max (a, clé = len) vous donne la plus longue chaîne (et len (max (a, clé = len)) vous donne sa longueur) sans nécessiter Pour coder une boucle explicite, mais bien sûr max fera sa propre boucle en interne, car il ne pouvait éventuellement identifier "la chaîne la plus longue" de toute autre manière.


0 commentaires

0
votes

Disons que je veux obtenir la plus longue chaîne de la deuxième colonne:

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


0 commentaires

0
votes

Je voudrais également mentionner une méthode de type C:

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


0 commentaires