【问题标题】:python: how to implement a matrix as column1=x column2=x^2... columnP=x^ppython:如何将矩阵实现为 column1=x column2=x^2... columnP=x^p
【发布时间】:2020-12-28 19:30:00
【问题描述】:

我想创建一个矩阵,其列数与给定输入的列数一样多(例如:p)。这些列将是第一个数组的幂值。我正在使用这样的数据集:

with open("dataset.csv") as f:
dataset = list(csv.reader(f))
for a in dataset:
    arr = np.append(arr, int(a[0]))  # arr = 1,1,2,3,3,3,3...
    one_list = np.append(one_list, 1)
x = np.column_stack((one_list, arr))

如果 p=3,我想要这样的矩阵:

x = [[1, 1, 1, 1]
     [1, 1, 1, 1]
     [1, 2, 4, 8]
     [1, 3, 9, 27]
      ...]

更新:我是这样解决的:

a = 2
p = 3

for i in range(p-1):
  arr1 = np.power(arr, a)
  a += 1
  x = np.column_stack((x, arr1))

结果是正确的,但如果我输入 p=4 或更多,它看起来像这样:

[[1.0000e+00 1.0000e+00 1.0000e+00 1.0000e+00 1.0000e+00 1.0000e+00
  1.0000e+00]
 [1.0000e+00 1.0000e+00 1.0000e+00 1.0000e+00 1.0000e+00 1.0000e+00
  1.0000e+00]
 [1.0000e+00 2.0000e+00 4.0000e+00 8.0000e+00 1.6000e+01 3.2000e+01
  6.4000e+01]
 [1.0000e+00 2.0000e+00 4.0000e+00 8.0000e+00 1.6000e+01 3.2000e+01
  6.4000e+01]
 [1.0000e+00 2.0000e+00 4.0000e+00 8.0000e+00 1.6000e+01 3.2000e+01
  6.4000e+01]...

我怎样才能有一个没有我上面提到的所有这些零的矩阵?任何帮助表示赞赏,谢谢

【问题讨论】:

  • 你尝试了什么,为什么失败了?我看到标签numpy - 看起来像是广播练习。
  • 已编辑,可以看我的实现
  • 感谢您添加代码。你能解释一下,它有什么问题吗?它会产生错误的结果吗?
  • 它会产生一个奇怪的矩阵,它看起来不像我想要的示例输出。有像 43046721、65536 这样的值。我不知道它们来自哪里......
  • 写你的更新:a 不需要使用 i 代替。确保在 for 循环之前将 arrx 初始化为某个默认值。你问为什么你的数组如果浮点数用指数表示法表示?

标签: python numpy loops matrix


【解决方案1】:

power/** 运算符的工作方式与 + 或 * 类似,broadcasting:

In [136]: arr = np.array([1,2,3])[:,None]
In [137]: arr
Out[137]: 
array([[1],
       [2],
       [3]])
In [138]: arr**np.array([1,2,3,4])
Out[138]: 
array([[ 1,  1,  1,  1],
       [ 2,  4,  8, 16],
       [ 3,  9, 27, 81]])

为了比较,乘法

In [139]: arr*np.array([1,10,100])
Out[139]: 
array([[  1,  10, 100],
       [  2,  20, 200],
       [  3,  30, 300]])

【讨论】:

  • **np.power() 有什么优势,或者它们在内部 numpy 工作中是否等效?我会使用后者,例如,np.power(np.asarray(arr)[:, None], np.arange(1, p + 1)[None, :]) 没有具体原因。
【解决方案2】:
  1. numpy 广播

您要查找的函数是np.cumprod()。请务必使用axis 参数。初始矩阵是使用广播构建的。

import numpy as np

p = 4
arr = np.r_[1,2,3]

np.cumprod(arr[:,np.newaxis]*np.ones(p),axis=1)
  1. 列表理解

您可以通过在附加的数组上循环来获得类似的结果。这是使用列表理解的简短表示。

np.stack([np.power(arr,i+1) for i in range(p)],axis=1)

【讨论】:

  • 我正在使用这样的数据集:arr= np.append(arr, int(a[0]))。 arr 的值是 1,1,1,2,2... 但是当我使用您的代码时,它会生成一个具有如下值的数组 [56.01240149 56.01240149 100.50909784 100.50909784 100.50909784]。你知道为什么会出现这个问题吗?
  • 我不明白你在写什么。您的评论与最初的问题有关吗? arr 和我的回答一样吗? a 是什么?
  • 你说得对,问题根本不清楚,对不起。 a 来自“for a in dataset:” arr 是我给数组的名称,它的值 = 1,1,1,2,2,3,4,4,4... 来自数据集.我正在用我的原始代码更新问题,如果您检查我将不胜感激
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多