Numpy Swap / Substitute NonType Entry with Numpy Array(即vector)

时间:2018-06-04 13:32:02

标签: arrays numpy python-3.5 nonetype

给定一个包含两种元素的numpy数组:

  1. " numpy.ndarray"条目和
  2. " NoneType"条目
  3. 如何更换所有" NoneType"例如,条目np.zeros(some_shape)? 是否也可以为任何类型的单个元素(例如标量而不是NoneType?

    )执行此操作

    示例:

    test_array=
        array([[array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ..., None, None,
        None],
       [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ..., None, None,
        None],
       [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None, None],
       ..., 
       [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None],
       [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None],
       [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
        array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)]], dtype=object)
    

    test_array中的数组可能如下所示:

    test_array[323]=
       array([array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None, None], dtype=object)
    

    我想替换那些"无"具有与其他向量相同长度的零向量的条目(这里位置0到3)。 所以我的每个数组的结果(test_array中的test_array [i]看起来像这样:

    test_array[131]=
       array([array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
       array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)], dtype=object)
    

    所以我想用np.zeros数组填充所有None条目。确实存在numpy函数np.nan_to_num,但这对我没有帮助,因为我需要类似" np.nan_to_array"。

    谢谢!

1 个答案:

答案 0 :(得分:0)

通常我不会在NumPy中使用for循环,但在你的情况下,你有一个对象数组,无论如何效率不高,并且处理None和存储的子数组的组合因为对象非常棘手。所以,保持简单:

prototype = a[0]
for i, x in enumerate(a):
    if x is None:
        a[i] = np.zeros_like(prototype)

当然,如果prototype为无,则您需要找a[0]。那是一个练习。