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_)
5 Réponses :
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. P>
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
max (a, clé = len) code> vous donne la plus longue chaîne (et len (max (a, clé = len)) code> vous donne sa longueur) sans nécessiter Pour coder une boucle explicite, mais bien sûr max code> fera sa propre boucle en interne, car il ne pouvait éventuellement identifier "la chaîne la plus longue" de toute autre manière. P>
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
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