如何创建混合整数与字符串的NumPy数组并替换指定元素?
解决混合类型数组的替换问题
嘿,我明白你遇到的问题了——numpy数组默认是强类型的,没法直接在整数数组里塞字符串,不过有两个简单的办法可以搞定:
首先先把你的问题贴出来方便参考:
我尝试用数组qn_red中的特定元素替换数组fre_index中的指定元素,以下是我的代码:
index = [] freq = [201001, 201002, 201003, 201004,201005, 201006, 201007, 201008, 201009, 201010, 201011, 201012,201013, 201014, 201015, 201016] freq_red = [201001.3, 201009.4, 201012.5] qn_red = ['v', 'n', 'c'] for j in range(len(freq_red)): for i in range(len(freq)-1): if freq[i] <= freq_red[j] <= freq[i+1]: index.append(i) fre_index = np.arange(len(freq)) for j in range(len(index)-1): for n, i in enumerate(fre_index): if i == index[j]: fre_index[n] = qn_red[j]运行时出现错误:
fre_index[n] = qn_red[j] ValueError: invalid literal for long() with base 10: 'v'
若将fre_index[n] = qn_red[j]替换为fre_index[n] = 34则代码可正常运行。我已了解这是因尝试在同一数组中混合字符串与整数导致的。我需要生成一个与freq长度相同,仅部分元素为qn_red中字符串的fre_index数组,请问该如何实现?
方法一:用numpy的object类型数组
numpy允许创建object dtype的数组,这种数组可以存储任意Python对象,自然就能同时放整数和字符串了。我还帮你优化了代码里的一些小问题,比如内层循环找到匹配后直接break,避免重复添加索引,替换的时候也不用嵌套循环找位置,直接用索引赋值就行:
import numpy as np index = [] freq = [201001, 201002, 201003, 201004,201005, 201006, 201007, 201008, 201009, 201010, 201011, 201012,201013, 201014, 201015, 201016] freq_red = [201001.3, 201009.4, 201012.5] qn_red = ['v', 'n', 'c'] # 查找需要替换的索引,找到后就退出内层循环 for j in range(len(freq_red)): for i in range(len(freq)-1): if freq[i] <= freq_red[j] <= freq[i+1]: index.append(i) break # 初始化object类型的numpy数组,支持混合类型 fre_index = np.arange(len(freq), dtype=object) # 直接按索引替换元素 for idx, val in zip(index, qn_red): fre_index[idx] = val print(fre_index)
方法二:用Python原生列表(更简单)
其实Python的原生列表本来就支持混合类型,如果你不需要numpy数组的其他功能,直接用列表会更省事:
index = [] freq = [201001, 201002, 201003, 201004,201005, 201006, 201007, 201008, 201009, 201010, 201011, 201012,201013, 201014, 201015, 201016] freq_red = [201001.3, 201009.4, 201012.5] qn_red = ['v', 'n', 'c'] # 同样先找索引 for j in range(len(freq_red)): for i in range(len(freq)-1): if freq[i] <= freq_red[j] <= freq[i+1]: index.append(i) break # 用列表初始化,直接替换 fre_index = list(range(len(freq))) for idx, val in zip(index, qn_red): fre_index[idx] = val print(fre_index)
这两种方法都能生成你需要的、部分元素为字符串的数组/列表,选哪种就看你后续有没有numpy的操作需求啦~
内容的提问来源于stack exchange,提问作者user_h
相关产品推荐
相关产品推荐

