【问题标题】:Assign values in matrix via indexing通过索引在矩阵中赋值
【发布时间】:2012-08-19 21:21:46
【问题描述】:

从 R 中,我习惯于为矩阵分配一个简单的值 通过使用以下索引:

> mat <- matrix(NA,2,3)
> mat
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
> mat[1,2] <- 12
> mat
     [,1] [,2] [,3]
[1,]   NA   12   NA
[2,]   NA   NA   NA
> 

现在我必须在 Python 中运行一些脚本并想收集 二维矩阵中的值也是如此。矩阵应该有列名和行名 我也想通过索引访问它们。 到目前为止,我想到了两种方法:

  • 要么使用 RPy,要么按照我在 R 中习惯的方式进行操作, 虽然我还不知道索引命令是如何与 RPy 一起工作的。

喜欢:

import rpy2.robjects as robjects

names = ['A','B','C']
dimnames = robjects.r['list'](names,names) 
mat = robjects.r['matrix'](NA, nrow = len(names), ncol=len(names), dimnames = dimnames)

# and here how to index and assign e.g. the value 12 to the cell mat["A","B"]??
  • 或者使用 Python 原生 NumPy 数组,这可能是更简洁的解决方案。目前我只是不知道如何使用名称列表创建矩阵/数组以及如何使用索引分配值。

有什么建议吗?

谢谢!!

【问题讨论】:

  • 你的意思是这是一个字符数组吗?如果没有,请使用NA 而不是"NA"
  • 当然,你说得对,应该是NA
  • 我怀疑你在 python 代码中需要robjects.NA_Real 而不是NA

标签: python arrays r numpy rpy2


【解决方案1】:

我认为DataFrame datatype from pandas 可能适合你。

import pandas
matrix = pandas.DataFrame(index=['a','b','c'], columns=['one','two'])

返回

   one  two
a  NaN  NaN
b  NaN  NaN
c  NaN  NaN

您可以更改条目:matrix['one']['a']=1,以及其他熟悉的 numpy 操作(如above link 中所述)。

【讨论】:

  • 到目前为止一切正常。从其列名和行名创建数据框非常容易:pandas.DataFrame(index=names, columns=names) 其中名称是指名称的 python 列表。
  • @Johannes 很高兴你喜欢它,我才刚刚开始使用它(昨晚发现它),所以没有意识到你可以这样做! :)
【解决方案2】:

您可以使用字典将行/列名称映射到索引。

names = ['A', 'B', 'C']
idx = range(0, len(names))
d = dict((key, value) for (key, value) in zip(names, idx))

然后用它来访问矩阵中的元素,

mat[d['A'], d['B']] = 12

据我所知,rpy2 的文档应该可以;如果没有, 也许下面的语法更合适:

mat.rx(d('A'), d('B'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2017-03-04
    • 2017-11-23
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多