python - 删除 numpy 数组中的所有非字符串值
问题描述
我有一个只有 str 和 nan 值的数组,例如:
x = numpy.recarray(
[('A', 'B', nan, nan),
('B', nan, nan, nan),
('A', 'B', 'H', 'Z')],
dtype=[('D1', 'O'), ('D2', 'O'),
('D3', 'O'), ('D4', 'O')])
我正在寻找一种有效的方法来删除所有 nan 值,并保留具有可变数量元素的数组。nan 值是浮点类型。
type(x[0][3])
out: float
提前谢谢估计
解决方案
您有一个形状 (3,) 和 4 个字段的重新排列:
In [85]: x = np.array(
...: [('A', 'B', np.nan, np.nan),
...: ('B', np.nan, np.nan, np.nan),
...: ('A', 'B', 'H', 'Z')],
...: dtype=[('D1', 'O'), ('D2', 'O'),
...: ('D3', 'O'), ('D4', 'O')])
In [86]: x
Out[86]:
array([('A', 'B', nan, nan), ('B', nan, nan, nan), ('A', 'B', 'H', 'Z')],
dtype=[('D1', 'O'), ('D2', 'O'), ('D3', 'O'), ('D4', 'O')])
In [87]: x.shape
Out[87]: (3,)
In [88]: x['D1']
Out[88]: array(['A', 'B', 'A'], dtype=object)
In [89]: x['D3']
Out[89]: array([nan, nan, 'H'], dtype=object)
你不能让那个衣衫褴褛。
但是您可以将其设为二维数组,然后进行列表推导:
In [93]: xx = np.array(x.tolist())
In [94]: xx
Out[94]:
array([['A', 'B', 'nan', 'nan'],
['B', 'nan', 'nan', 'nan'],
['A', 'B', 'H', 'Z']], dtype='<U3')
In [95]: [[i for i in row if i!='nan'] for row in xx]
Out[95]: [['A', 'B'], ['B'], ['A', 'B', 'H', 'Z']]
我们还可以对结构化数组的元素进行理解:
In [101]: [[i for i in row if i is not np.nan] for row in x]
Out[101]: [['A', 'B'], ['B'], ['A', 'B', 'H', 'Z']]
的元素x
类似于元组。从技术上讲,它是np.void
(复合 dtype 记录),但它像元组一样迭代。
推荐阅读
- python - OTB 是否足以评估随机森林或装袋分类器,或者交叉验证也适用于此?
- javascript - 访问未知深度的多级字典中的元素
- c# - 使用 Scrutor 自动解析 DI
- ios - 使用 WKWebView 读取本地存储数据
- angular - 将两个参数传递给 ng 模型 - Typescript
- python - 通过 python 的 SharePoint 结帐文件
- javascript - React Native 嵌套箭头函数和普通箭头函数的区别
- python - 如何使用 Selenium (Python) 查找 title="xyz" 元素
- javascript - 使用 Puppeteer 选择复选框
- load-balancing - Traefik 作为 MQTT over tcp 和 TLS 的负载均衡器