【问题标题】:How to avoid overwriting a value through for loop in python?如何避免通过python中的for循环覆盖值?
【发布时间】:2020-08-27 02:57:43
【问题描述】:

下面是我编码的。这里的问题是我在 A 矩阵中有值 1、2 和 3,因此在输出 A 的所有值都是 1。
我期望的结果是:

A = np.matrix([[1, 2, 2, 1], 
               [1, 1, 3, 1],
               [1, 1, 1, 3]]).

感谢任何帮助。对不起我写得不好。谢谢!

A = np.matrix([[1, 15, 23, 2], [3, 2, 56, 7], [2, 6, 8, 25]])
bound = np.array([1, 15, 25, 56])
for i in range(3, 0, -1):
    A[np.logical_and(bound[i - 1] <= A, A <= bound[i])] = i

【问题讨论】:

  • 感谢您的及时回复。输出矩阵的第一个元素是 0。我希望有 1
  • 如果1映射到1,为什么15也映射到1?不应该是2 吗?因为bound 中有一个15
  • 不过不管怎样,你可以试试np.searchsorted(bound, A, side='right') 看看它是否能满足你的需求。
  • 抱歉!是的,15 必须是 2。我尝试使用 np.searchsorted(bound, A, side='right')。它不起作用

标签: python arrays numpy matrix


【解决方案1】:

一种方法是将更改的元素保存在单独的mask_

mask_ = np.ones_like(A, dtype=bool)
for i in range(3,0,-1):
    mask = np.logical_and(bound[i - 1] <= A, A <= bound[i])
    A[np.multiply(mask_,mask)] = i
    mask_ = np.multiply(mask_,~mask)

输出:

[[1 2 2 1]
 [1 1 3 1]
 [1 1 1 3]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2016-07-17
    • 2017-09-20
    • 1970-01-01
    • 2020-08-26
    • 2017-08-27
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多