【问题标题】:Fill values into numpy array that depend non-trivially on indices将值填充到非常依赖于索引的 numpy 数组中
【发布时间】:2021-11-07 08:24:26
【问题描述】:

问题:我试图用一些值取决于索引(i, j) 的值以某种非平凡的方式填充二维数组arr。更准确地说,ij 一起提供了一个新索引 kijk 都具有相同的范围),然后我用它来查找其他数组中的值(即H[i,j] = values[k])。

我最初的想法是np.put_along_axis 可以用于此。我生成了两个列表indicesvalues,这样

nrows, ncols = arr.shape
for i in range(nrows):
    arr[i, indices[i]] = values[i]

原则上这很好用,但是当我尝试时

np.put_along_axis(arr, indices, values, axis=1)

我收到以下错误

AttributeError: 'list' object has no attribute 'dtype'

但是,我无法将这些列表放入数组中,因为它们很杂乱;有些行需要插入的值比其他行少。我想知道有没有办法使用np.put_along_axis

【问题讨论】:

  • put_along 本质上是x[np.arange(...), indices],每行的索引中都有一个值。所以indices 应该是 1d 或 2d 与匹配的行数。
  • 您能提供一个minimal reproducible example吗?这将有助于了解您要做什么。

标签: python arrays numpy indexing


【解决方案1】:

简而言之,您可能想使用np.indices

由于您没有给出示例,我将使用索引来计算极坐标并在另一张图片中查找它们。

首先我有一张图片以便稍后查找值

import matplotlib.pyplot as plt
import matplotlib
import numpy as np

n = 100
func = lambda i,j: np.linalg.norm(np.array([i-n/2,j-n/2]), axis=0)
arr = np.fromfunction(func, (n,n), dtype='int')
arr = (arr < np.median(arr)).astype('int')
plt.imshow(arr, cmap='gray')

现在我计算上图的极坐标。如果您需要复习微积分。这意味着我们通过到点的距离和角度来识别点。 IE。如果你在下图中向左/向右走,你在上面的一个圆圈(逆时针/顺时针)上上下意味着你​​去中心和远离中心。在极坐标中,圆盘应该或多或少变成一个矩形。

r,phi = np.indices(arr.shape, dtype='float')
r *= 50/100
phi *= 2*np.pi/100

def polar2cartesian(r, phi):
    x = r * np.cos(phi)
    y = r * np.sin(phi)
    return(x, y)

i,j = polar2cartesian(r, phi)
i = (i+50).astype('int')
j = (j+50).astype('int')

out = np.zeros(arr.shape)
out = arr[i,j]
plt.imshow(out, cmap='gray')
plt.xlabel('phi (0 to 2pi)')
plt.ylabel('r (0 to 50)')

【讨论】:

  • 是的,它做到了!我使用了 np.meshgrid,这正是我需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 2015-02-23
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2018-08-27
相关资源
最近更新 更多