如何将字符串的 ndarray 列表转换为浮点数
How to convert a list of ndarray of strings into floats
如何将包含字符串对象的 ndarray 列表映射到特定的浮点数?例如,如果用户决定将 orange
映射到 1.0 并将 grapefruit
映射到 2.0 ?
myList = [np.array([['orange'], ['orange'], ['grapefruit']], dtype=object), np.array([['orange'], ['grapefruit'], ['orange']], dtype=object)]
所以会有:
convList = [np.array([['1.0'], ['1.0'], ['2.0']], dtype=float), np.array([['1.0'], ['2.0'], ['1.0']], dtype=float)]
我尝试实现这个功能:
def map_str_to_float(iterator):
d = {}
for ndarr in iterator:
for string_ in ndarr:
d[string_] = float(input('Enter your map for {}: '.format(string_)))
return d
test = map_str_to_float(myList)
print(test)
但我收到以下错误:
d[string_] = float(input('Enter your map for {}: '.format(string_)))
TypeError: unhashable type: 'numpy.ndarray'
我相信这是因为 string_
的类型是一个 numpy 数组而不是字符串...
使用该嵌套循环,您将要求用户输入 6 次(但您有 2 个值 grapefruit
和 orange
)。我建议您先获取唯一值,然后只要求唯一值:
这样做:
unique_values = np.unique(np.array(myList))
现在作为用户为一个数字的每个唯一值:
d = {}
for unique_value in unique_values:
d[unique_value] = float(input(f"give me a number for {unique_value} "))
现在您在变量 d
中得到了您的地图。
评论后更新
那你就可以自己写一个独特的方法了。
请注意,只要是 1D,下面的代码将获取所有唯一值,而不管它的长度如何。
unique_values = []
for each_ndarray in myList:
for value in each_ndarray:
if not value[0] in unique_values:
unique_values.append(value[0])
报错,调试时string_是一个数组['orange'],不能是字典的key
至于如何将字符串的ndarray列表转换为浮点数
我们使用索引,获取字符串的索引,并使用这些索引以相同的顺序打印所需的新索引。
基本上 np.array([1, 2])[0, 1, 0, 0]
将给出大小为 4 的新数组,其中的条目按索引顺序排列。将应用相同的逻辑,这将跳过 python 中的字典映射。映射操作将通过 C 中的索引进行,因此应该很快。
评论应该解释发生了什么
import numpy as np
dataSet = np.array(['kevin', 'greg', 'george', 'kevin'], dtype='U21')
# Get all the unique strings, and their indices
# Values of indices are based on uniques ordering
uniques, indices = np.unique(dataSet, return_inverse=True)
# >>> uniques
# array(['george', 'greg', 'kevin'], dtype='<U21')
# >>> indices
# array([2, 1, 0, 2])
# Originial array
# >>> uniques[indices]
# array(['kevin', 'greg', 'george', 'kevin'], dtype='<U21')
new_indices = np.array([float(input()) for e in uniques])
# Get new indices indexed using original positions of unique strings in numpy array
print(new_indices[indices])
# You can do the same for multi dimensional arrays
如何将包含字符串对象的 ndarray 列表映射到特定的浮点数?例如,如果用户决定将 orange
映射到 1.0 并将 grapefruit
映射到 2.0 ?
myList = [np.array([['orange'], ['orange'], ['grapefruit']], dtype=object), np.array([['orange'], ['grapefruit'], ['orange']], dtype=object)]
所以会有:
convList = [np.array([['1.0'], ['1.0'], ['2.0']], dtype=float), np.array([['1.0'], ['2.0'], ['1.0']], dtype=float)]
我尝试实现这个功能:
def map_str_to_float(iterator):
d = {}
for ndarr in iterator:
for string_ in ndarr:
d[string_] = float(input('Enter your map for {}: '.format(string_)))
return d
test = map_str_to_float(myList)
print(test)
但我收到以下错误:
d[string_] = float(input('Enter your map for {}: '.format(string_)))
TypeError: unhashable type: 'numpy.ndarray'
我相信这是因为 string_
的类型是一个 numpy 数组而不是字符串...
使用该嵌套循环,您将要求用户输入 6 次(但您有 2 个值 grapefruit
和 orange
)。我建议您先获取唯一值,然后只要求唯一值:
这样做:
unique_values = np.unique(np.array(myList))
现在作为用户为一个数字的每个唯一值:
d = {}
for unique_value in unique_values:
d[unique_value] = float(input(f"give me a number for {unique_value} "))
现在您在变量 d
中得到了您的地图。
评论后更新
那你就可以自己写一个独特的方法了。 请注意,只要是 1D,下面的代码将获取所有唯一值,而不管它的长度如何。
unique_values = []
for each_ndarray in myList:
for value in each_ndarray:
if not value[0] in unique_values:
unique_values.append(value[0])
报错,调试时string_是一个数组['orange'],不能是字典的key
至于如何将字符串的ndarray列表转换为浮点数
我们使用索引,获取字符串的索引,并使用这些索引以相同的顺序打印所需的新索引。
基本上 np.array([1, 2])[0, 1, 0, 0]
将给出大小为 4 的新数组,其中的条目按索引顺序排列。将应用相同的逻辑,这将跳过 python 中的字典映射。映射操作将通过 C 中的索引进行,因此应该很快。
评论应该解释发生了什么
import numpy as np
dataSet = np.array(['kevin', 'greg', 'george', 'kevin'], dtype='U21')
# Get all the unique strings, and their indices
# Values of indices are based on uniques ordering
uniques, indices = np.unique(dataSet, return_inverse=True)
# >>> uniques
# array(['george', 'greg', 'kevin'], dtype='<U21')
# >>> indices
# array([2, 1, 0, 2])
# Originial array
# >>> uniques[indices]
# array(['kevin', 'greg', 'george', 'kevin'], dtype='<U21')
new_indices = np.array([float(input()) for e in uniques])
# Get new indices indexed using original positions of unique strings in numpy array
print(new_indices[indices])
# You can do the same for multi dimensional arrays