【问题标题】:Extracting and transforming data in numpy在 numpy 中提取和转换数据
【发布时间】:2017-09-17 17:33:08
【问题描述】:

假设我有以下 numpy 向量

[[1, 3., 'John Doe', 'male', 'doc', '25'],
  ...,
 [9, 6., 'Jane Doe', 'female', 'p', '28']]

我需要提取与我的任务相关的数据。

一般来说,作为 numpy 和 python 的新手,我会按照以下方式进行操作:

data = np.array(
[[1, 3., 'John Doe', 'male', 'doc', 25],
 [9, 6., 'Jane Doe', 'female', 'p', 28]]
)

data_tr = np.zeros((data.shape[0], 3))
for i in range(0, data.shape[0]):
    data_tr[i][0] = data[i, 1]
    data_tr[i][1] = 0 if data[i, 3] == 'male' else 1
    data_tr[i][2] = data[i, 5]

结果我得到了以下结果:

[[  3.,   0.,  25.],
 [  6.,   1.,  28.]]

我想知道是否有更有效或更清洁的方法来执行此操作。
有人可以帮我吗?

【问题讨论】:

  • 几个 cmets - np.array 是一个连续的对象,这意味着每个元素都必须是相同的类型,所以 data 的结果已经是一个字符串列表,因为你不能将“男性”和其他字符串编组为数字类型。最好使用列表。
  • 看看data。它是一个 (2,6) 字符串数组,而不是混合数字和字符串。另一方面,data_tr 是默认的float dtype。从data 分配给data_tr 时,numpy 尝试将字符串转换为浮点数。在这种情况下,它可以工作。但是如果你弄错了列,它可能会出错。

标签: python python-3.x numpy


【解决方案1】:

column-indexing 的一种方法-

data_tr = np.zeros((data.shape[0], 3))
data_tr[:,[0,2]] = data[:, [1,5]]
data_tr[:,1] = data[:,3]=='male'

请注意,步骤:data_tr[:,[0,2]] = data[:, [1,5]] 正在处理各个列的副本。这些对于分配和提取不是很有效。因此,您可能希望分两个单独的步骤来执行此操作,主要是为了提高性能,就像这样 -

data_tr[:,0] = data[:, 1]
data_tr[:,2] = data[:, 5]

【讨论】:

  • 重新阅读评论似乎您实际上只讨论了algorithm 部分。尽管您应该首先将用户指向列表。 +1
  • @Chinny84 我不知道输入的来源。因此,我无法容忍或不容忍投入。作为回答者,我从给定的输入开始并尝试获得所需的输出。我不确定这是否能解决您的问题,但我希望可以。
  • 你好,迪瓦卡!感谢您的回答,这肯定是我想要的!虽然肯定回答了主要部分,但我想询问处理像我这样的数据的最佳实践。正如@Chinny84 指出的那样(正如我所怀疑的那样),我绝对不会使用 bes 方法。
  • @DmitryVolkov 正如 Chinny84 正确提到的那样,要使用这种混合 dtype 数据,列表可能是最好的方法。或者,如果您只使用 int 和字符串,请将其保存在两个单独的数组中。我主要是从性能的角度说的。对于更清洁的工作流程,再次列出可能是要走的路。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2014-12-21
  • 2011-10-10
  • 2017-01-13
相关资源
最近更新 更多