Python 在numpy中,删除列中的条目无法转换为浮点的行
我在numpy中有一个数组,在检查它的过程中,我意识到一个特定列中的一些值包含乱七八糟的字符串 例如,可疑列是第二列,其外观如下:Python 在numpy中,删除列中的条目无法转换为浮点的行,python,arrays,numpy,Python,Arrays,Numpy,我在numpy中有一个数组,在检查它的过程中,我意识到一个特定列中的一些值包含乱七八糟的字符串 例如,可疑列是第二列,其外观如下: ['Joe', '200.00'] ['Fred', 'adfdfddfds'] ['Zhu', '5000.00'] ['text_ok_here', '10.10'] (请注意,dtype是字符串) 我最终希望: ['Joe', '200.00'] ['Zhu', '5000.00'] ['text_ok_here', '10.10'] 我需要删除在我的特定
['Joe', '200.00']
['Fred', 'adfdfddfds']
['Zhu', '5000.00']
['text_ok_here', '10.10']
(请注意,dtype
是字符串)
我最终希望:
['Joe', '200.00']
['Zhu', '5000.00']
['text_ok_here', '10.10']
我需要删除在我的特定列中挂起的、包含无法转换为float的字符串的任何整行
最初,我想我可以迭代该列,收集与不符合条件的条目匹配的索引,然后使用它来子集我的原始数组
大致如下:
for entry in my particular column:
if <entry is a string, not a float>
<delete that whole row of the matrix>
对于我的特定列中的条目:
如果
但这行不通,因为不管怎么说,一切都是一个字符串
我一直在处理转换类型的问题,但我没有直接的方法来测试这种胡言乱语。此外,即使我找到了正确的索引,我也不确定如何进行子集设置
我觉得这是非常常见的事情——清理数组,但要完成这项工作却非常困难
任何建议/理念等都将不胜感激。了解数据的
dtype
非常重要,但如果数据是float
或int
或任何类似dtype
s的数字,boolean
索引就足够了
数据文件:
<temp.txt>
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 bad
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 bad
1 2 3 4 5 6
1 2 3 4 5 6
编辑
如果数组
已经在字符串
中,这可能是最简单的:
In [40]:
%%file temp.txt
1000.00 200.00
4000.00 adfdfddfds
20.00 5000
text_ok_here 5000
Overwriting temp.txt
In [53]:
A=np.genfromtxt('temp.txt', dtype=str)
B=np.genfromtxt('temp.txt')
In [55]:
A[np.isfinite(B[:,1])]
Out[55]:
array([['1000.00', '200.00'],
['20.00', '5000'],
['text_ok_here', '5000']],
dtype='|S12')
基本上将数据读入
A
作为字符串的数组
;将B
转换为float
和NAN
中无法转换为有效数字的位置,然后根据B
获取a
的一部分。遍历检查您的条件的行的数字索引。如果不满足条件,请将索引添加到包含要保留的行索引的列表keep
。然后,您可以使用listkeep
对数组进行切片,以获得仅包含不满足消除条件的行的数组。要使用列表对数组a
进行切片keep
,请执行a[keep]
。如果要覆盖原始数组,请执行a=a[keep]
。下面是一个示例,它在切片之前打印数组、要保留的索引列表以及切片之后的数组
#!/usr/bin/env python
import numpy
a = numpy.array([['foo', 2, 3], [4, 5, None], [7, 8, 'bar'], [10, None, 12]])
print(a)
keep = []
j = 2
for i in range(0, a.shape[0]) :
if not(a[i, j] is None or isinstance(a[i, j], basestring)) :
keep.append(i)
print keep
a2 = a[keep]
print(a2)
朱CT,我有一个字符串数组。但如果是这样,如果
,对每个单元格来说不是都是真的吗?因为单元格位于str
?在这种情况下,胡言乱语的标准是什么?你完全正确。甚至我的伪代码也不起作用!!要测试一个细胞是否胡言乱语?除了眼球测试之外马克:这是一个极好的答案。我很遗憾地说,我已经编辑了我的问题,因为我对我面临的问题越来越熟悉,而你的优秀解决方案并不适用。对不起,不用担心。祝你申请好运!但是,“text\u ok\u here”
不能转换为数字,是否也应该将其删除?它只是第二列,包含我们不想要的值。第一列必须保持不变。
#!/usr/bin/env python
import numpy
a = numpy.array([['foo', 2, 3], [4, 5, None], [7, 8, 'bar'], [10, None, 12]])
print(a)
keep = []
j = 2
for i in range(0, a.shape[0]) :
if not(a[i, j] is None or isinstance(a[i, j], basestring)) :
keep.append(i)
print keep
a2 = a[keep]
print(a2)