从一维 numpy 数组中获取这种矩阵的最有效方法是啥?

Posted

技术标签:

【中文标题】从一维 numpy 数组中获取这种矩阵的最有效方法是啥?【英文标题】:What is the most efficient way to get this kind of matrix from a 1D numpy array?从一维 numpy 数组中获取这种矩阵的最有效方法是什么? 【发布时间】:2016-01-18 19:30:03 【问题描述】:

我有一个包含 4950 值的文件,例如:

0.012345678912345678

我使用以下方式读取文件:

a = numpy.genfromtxt(file_name, dtype=str, delimiter=',') # a.shape = (4950L, 1L) #dtype=str as I don't want to compromise accuracy
#say a == ['0.000000000000000001', -'0.000000000000000002', ...., '0.000000000004950']

我想要实现的是获得一个大小为(100L, 100L) 的矩阵b,其:

    上三角值用 numpy 数组 'a' 中的值填充。 下三角值用 numpy 数组“a”中的值填充,但乘以 -1。 对角线仅包含零。

示例(准确性很重要):

array = ['1','2','-3','-5','6','-7'] # In reality the data is up to 18 decimal places.

final_matrix = [
               ['0','1','2','-3'],
               ['-1',0,'-5','6'],
               ['-2','5','0','-7'],
               ['3','-6','7','0']
               ]

实现这一目标的最有效方法是什么?

【问题讨论】:

你的文件格式是什么?一行、一列、多列? ***.com/questions/34234965/… - 最近的一个类似问题Copy flat list of upper triangle entries to full matrix 【参考方案1】:

不确定这是否是最有效的方法,但这似乎很有效。

import numpy

# create some random data for testing
sz = 100
a  = numpy.random.random(sz*sz/2 - sz/2).astype('S50')

# convert back to float for a test on minus signs,
# as it would be done if a is read as string values
amins = numpy.where(a.astype(float) <= 0, "", "-")

# get the values without minus signs
aplus = numpy.char.lstrip(a, "-")

# addup to negated string values
aminus = numpy.char.add(amins, aplus)

# create an empty matrix
m = numpy.zeros(shape=(sz,sz), dtype='S51')
# ids of the upper triangle
u_ids = numpy.triu_indices(sz,1)
# set upper values
m[u_ids] = a
# switch coordinates to set lower values
m[u_ids[1],u_ids[0]] = aminus
# fill diag with zeros
numpy.fill_diagonal(m, numpy.zeros(sz).astype('S51'))


print m

【讨论】:

有多种方法可以使用np.tri... 函数来填充上下三角数组。但听起来 OP 更担心长整数(无论是数字类型还是字符串)。 太棒了。最后一行可以简单地是 m-m.T 。数据似乎是 float64 ? 是的,根据文档,numpy.zeros 的默认 dtype 是 float64。 关于尝试大于np.float64的问题:***.com/questions/29820829/… 更新示例以使用字符串

以上是关于从一维 numpy 数组中获取这种矩阵的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Numpy - 从一维数组中删除最后一个元素的最佳方法?

使用 NumPy 从矩阵中获取最小/最大 n 值和索引的有效方法

如何使用 numpy 从一维数组创建对角矩阵?

python如何挑选矩阵中的不相领的列组成新的矩阵

在 Tensorflow 中进行这种基于切片的乘法的最有效方法

numpy中的ndarray方法和属性