首页 > 解决方案 > 函数 numpy.apply_along_axis 意外结果

问题描述

我想编写一个函数来将 2D numpy 数组转换为 Mathematica 矩阵语法。但是,我发现了numpy.apply_along_axis函数的一些意外行为。

这是一段代码来显示这种奇怪的行为

import numpy as np
A=np.array([[-5,6,-7,6,0],[-5,-3,-9,-1,0],[1,-4,0,-4,-4],[4,0,-3,-4,3]])
func=lambda x: '{' + ','.join(x) + '}'
A=A.astype(str)
print(np.apply_along_axis(func,1,A))
print([func(row) for row in A])

输出:

['{-5,6,-7,6,0}' '{-5,-3,-9,-1,' '{1,-4,0,-4,-4' '{4,0,-3,-4,3}']
['{-5,6,-7,6,0}', '{-5,-3,-9,-1,0}', '{1,-4,0,-4,-4}', '{4,0,-3,-4,3}']

似乎该函数func未正确应用于 array 的第 1 行和第 2 行A

Python version: 3.6.9
OS: Ubuntu Linux 18.04.4 LTS
Numpy version: 1.13.3

标签: pythonarraysnumpy

解决方案


这似乎与输出数组的类型(字符串)有关。将您的第一个输出转换为字符串后,numpy似乎根据第一个字符串的长度定义其类型:<U13. 所有后续输出都以该长度截断。测试如下:

In [20]: b = np.apply_along_axis(func,1,A)
In [21]: b
Out[21]:
array(['{-5,6,-7,6,0}', '{-5,-3,-9,-1,', '{1,-4,0,-4,-4', '{4,0,-3,-4,3}'],
      dtype='<U13')

正如您在问题中已经指出的那样,有一些方法可以在不使用np.apply_along_axis. 例如,继续您的方法,您可以说:

output = [func(x) for x in A]

对于 2D numpy 数组,该in操作一次返回一行,因此您的输出将是一个字符串列表:

['{-5,6,-7,6,0}', '{-5,-3,-9,-1,0}', '{1,-4,0,-4,-4}', '{4,0,-3,-4,3}']

推荐阅读