📜  修改 Numpy 数组以存储任意长度的字符串

📅  最后修改于: 2022-05-13 01:54:36.690000             🧑  作者: Mango

修改 Numpy 数组以存储任意长度的字符串

NumPy 建立在成功的 Numeric 数组对象之上(并且是其后继者)。它的目标是为科学计算的有用环境创造基石。 NumPy 提供了两个基本对象:一个 N 维数组对象 (ndarray) 和一个通用函数对象 (ufunc)。

包含字符串值的任何 numpy 数组的 dtype 是数组中存在的任何字符串的最大长度。一旦设置,它将只能存储长度不超过创建时最大长度的新字符串。如果我们尝试重新分配长度大于现有元素最大长度的另一个字符串值,它只会丢弃超出最大长度的所有值。

在这篇文章中,我们将讨论克服这个问题并创建任意长度的 numpy 数组的方法。

让我们首先可视化创建字符串类型的任意长度 numpy 数组的问题。

# importing numpy as np
import numpy as np
  
# Create the numpy array
country = np.array(['USA', 'Japan', 'UK', '', 'India', 'China'])
  
# Print the array
print(country)

输出 :

正如我们在输出中看到的,给定数组中任何字符串长度元素的最大长度为 5。让我们尝试在数组中缺失值的位置分配一个长度更大的值。

# Assign 'New Zealand' at the place of missing value
country[country == ''] = 'New Zealand'
  
# Print the modified array
print(country)

输出 :

正如我们在输出中看到的那样,由于长度的限制,分配了“New Z”而不是“New Zealand”。现在,让我们看看解决这个问题的方法。

问题 #1:创建一个任意长度的 numpy 数组。

解决方案:在创建数组时为其分配“对象”dtype。这让您拥有Python字符串的所有行为。

# importing the numpy library as np
import numpy as np
  
# Create a numpy array
# set the dtype to object
country = np.array(['USA', 'Japan', 'UK', '', 'India', 'China'], dtype = 'object')
  
# Print the array
print(country)

输出 :

现在我们将在给定数组中缺失值的位置分配一个任意长度的值。

# Assign 'New Zealand' to the missing value
country[country == ''] = 'New Zealand'
  
# Print the array
print(country)

输出 :

正如我们在输出中看到的,我们已经成功地将任意长度的字符串分配给给定的数组对象。

问题 #2:创建一个任意长度的 numpy 数组。

解决方案:我们将使用numpy.astype()函数来更改给定数组对象的 dtype。

# importing the numpy library as np
import numpy as np
  
# Create a numpy array
# Notice we have not set the dtype of the object
# this will lead to the length problem 
country = np.array(['USA', 'Japan', 'UK', '', 'India', 'China'])
  
# Print the array
print(country)

输出 :

现在我们将使用numpy.astype()函数更改给定数组对象的 dtype。然后我们将给它分配一个任意长度的字符串。

# Change the dtype of the country
# object to 'U256'
country = country.astype('U256')
  
# Assign 'New Zealand' to the missing value
country[country == ''] = 'New Zealand'
  
# Print the array
print(country)

输出 :

正如我们在输出中看到的,我们已经成功地将任意长度的字符串分配给给定的数组对象。

注意:在这种情况下,我们可以在更改 dtype 后分配的字符串的最大长度为 256。