首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除Numpy数组中的列

如何删除Numpy数组中的列
EN

Stack Overflow用户
提问于 2020-06-17 06:39:22
回答 4查看 834关注 0票数 0

我的数组看起来如下(9列)

代码语言:javascript
复制
[('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995,'apt', 1000000)
 ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000)
  ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma', 1000000)] 

print(a.shape)
output >> (3,)
print(len(a))
output >> 3

我想删除最后的第二栏,所以它将如下所示

代码语言:javascript
复制
[('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 1000000)
 ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 1010000)
  ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 1000000)] 

我尝试了np.delete函数:

代码语言:javascript
复制
b = np.delete(a,7,axis=1)

Error >> AxisError: axis 1 is out of bounds for array of dimension 1

我的数组有9列的多行,只想删除一列。

任何帮助都将不胜感激。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-17 07:25:58

首先要注意的是,您有一个结构化的 Numpy数组。

它必须用dtype参数创建,否则所有字段类型都是U。(一定大小的Unicode字符串)。我创建了这样一个数组,运行如下:

代码语言:javascript
复制
a = np.array([
    ('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 'apt', 1000000),
    ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000),
    ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma',  1000000)],
    dtype='U7, U3, U10, i4, U10, f4, i4, U4, i4')

请注意,即使您没有传递字段名(只有上面这样的类型),Numpy仍然会指定默认的字段名称,如f0、f1等等。

要打印字段名,可以运行例如a.dtype.names。在上述情况下,我得到:

代码语言:javascript
复制
('f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8')

因此,您的任务可能是删除f7字段(在您的环境中签入)。也许您有一些由代码明确指定的字段名,所以使用最后一个名称代替。

若要获得删除此列的Numpy数组的副本,可以运行:

代码语言:javascript
复制
import numpy.lib.recfunctions as rcf
b = rcf.drop_fields(a, 'f7')

或者把它保存在一个你愿意的地方。

Yang --关于 Jason提出的解决方案的一点看法

如果您运行b.shape,您将得到(3, 9),而您的示例包含(3,),而我创建的数组正是这个形状。

因此,您的数组一定是以其他方式创建的,而不是在他的解决方案中。

票数 0
EN

Stack Overflow用户

发布于 2020-06-17 06:46:39

a.shape:(3,),它意味着在轴0上只有3个元素,没有轴1。应该检查如何将矩阵数据分配给。

代码语言:javascript
复制
import numpy as np

a = [('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 'apt', 1000000),
     ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000),
     ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma',  1000000)]

b = np.array(a)

c = np.delete(b,7,axis=1)
票数 3
EN

Stack Overflow用户

发布于 2020-06-17 07:08:55

虽然other answer对常规数组是正确的,但它没有回答OP中的问题,即结构化数组的问题。在这种情况下,您可以创建一个只包含所需列的新数组,即不是删除不需要的列,而是选择想要的列。

删除第七列的示例:

代码语言:javascript
复制
b = a[list(a.dtype.names[:7] + arr.dtype.names[8:])]

您还可以使用助手函数drop_fields

代码语言:javascript
复制
from numpy.lib import recfunctions as rfn
b = rfn.drop_fields(a, a.dtype.names[7])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62422867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档