在numpy中,删除列中无法转换的行

2024-05-09 01:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我在numpy中有一个数组,在检查它的过程中,我意识到某个特定列中的某些值包含胡言乱语的字符串。在

例如,嫌疑犯列是第二列,它看起来像这样:

['Joe', '200.00']
['Fred', 'adfdfddfds']
['Zhu', '5000.00']
['text_ok_here', '10.10']

(请注意,dtype是字符串)

我最终希望:

^{pr2}$

我需要删除任何一个完整的行,它有一个不能转换成float的字符串,挂在我的特定列中。在

最初,我在想我可以遍历这个列,收集与有问题的条目匹配的索引,并使用它来对原始数组进行子集化。在

大致如下:

for entry in my particular column:
    if <entry is a string, not a float>
        <delete that whole row of the matrix>

但这行不通,因为一切都是一串线。在

我一直在处理转换类型的问题,但我没有直接的方法来测试这种胡言乱语。此外,即使我找到了正确的指数,我也不确定如何进行细分。在

我觉得这是很常见的事情——清理一个数组,但要完成这一点却有着惊人的困难。在

如有任何建议/理念等,将不胜感激。在


Tags: 字符串textnumpyhere过程ok数组fred
2条回答

知道您的数据在dtype中是非常重要的,但是如果它是float或{}或者{}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

解决方案:

^{pr2}$

编辑

如果array已经在string中,这可能是最简单的:

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,作为strings的array;读入Bfloat和{}中,然后根据B得到{}的一部分。在

这里有一种方法。迭代检查条件行的数值索引。如果不满足条件,请将索引添加到包含要保留的行索引的列表keep。然后,可以使用列表keep对数组进行切片,以获得一个只包含不满足消除条件的行的数组。要使用列表keep分割数组a,请执行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)

相关问题 更多 >