Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串操作应用于numpy数组?_Python_Numpy - Fatal编程技术网

Python 将字符串操作应用于numpy数组?

Python 将字符串操作应用于numpy数组?,python,numpy,Python,Numpy,是否有更好的方法将字符串操作应用于ndarrays而不是对其进行迭代?我想使用“矢量化”操作,但我只能考虑使用map(所示示例)或列表理解 Arr = numpy.rec.fromrecords(zip(range(5),'as far as i know'.split()), names='name, strings') print ''.join(map(lambda x: x[0].upper()+'.',Arr['strings'

是否有更好的方法将字符串操作应用于
ndarray
s而不是对其进行迭代?我想使用“矢量化”操作,但我只能考虑使用
map
(所示示例)或列表理解

Arr = numpy.rec.fromrecords(zip(range(5),'as far as i know'.split()),
                            names='name, strings')

print ''.join(map(lambda x: x[0].upper()+'.',Arr['strings']))
=> A.F.A.I.K.
例如,在R语言中,字符串操作也被矢量化:

> (string <- unlist(strsplit("as far as i know"," ")))
[1] "as"   "far"  "as"   "i"    "know"
> paste(sprintf("%s.",toupper(substr(string,1,1))),collapse="")
[1] "A.F.A.I.K."
>(字符串粘贴(sprintf(“%s.”)、toupper(substr(string,1,1))、collapse=“”)
[1] “A.F.A.I.K.”

更新:请参见此问题:Numpy最近添加了一个用于基本字符串操作的
Numpy.char
模块

简短回答:Numpy不提供矢量化字符串操作。惯用的方法是执行以下操作(其中
Arr
是您的Numpy数组):

很长的回答,这就是为什么numpy不提供矢量化字符串操作的原因:(在这两者之间有一点杂乱无章)

在数据结构方面,一种尺寸不能适合所有尺寸。

对于来自非特定领域编程语言的人来说,您的问题可能看起来很奇怪,但对于来自特定领域编程语言的人来说,这很有意义

Python为您提供了各种各样的数据结构选择。有些数据结构在某些任务上比其他数据结构更好

首先,numpy数组不是python中默认的“hold all”容器。python的内置容器非常擅长于它们的设计目的。通常,列表或dict是您想要的

Numpy的
ndarray
s用于同质数据。

简而言之,numpy没有向量化的字符串操作

ndarray
s是一个专门的容器,专注于在尽可能少的内存中存储N维同质组的项目。重点是最大限度地减少内存使用(我有偏见,因为这正是我需要它们的主要原因,但这是一种很有用的思考方式。)矢量化的数学运算只是将事物存储在连续的内存块中的一个很好的副作用

字符串通常具有不同的长度。

例如,
['Dog'、'Cat'、'Horse']
.Numpy采用类似数据库的方法,要求您为字符串定义长度,但字符串不应是固定长度这一简单事实有很多含义

最有用的字符串操作返回可变长度的字符串。(例如,
。。。。。在您的示例中,join(…)

那些没有的(例如upper等),如果您愿意,您可以用其他操作来模拟。(例如upper大致是
(x.view(np.uint8)-32)。view('S1')
。我不建议您这样做,但您可以…)

作为一个基本的例子:
'a'+'B'
产生
'AB'
'AB'
的长度与
'a'
'B'
的长度不同。Numpy处理实现这一点的其他事情(例如
np.uint8(4)+np.float(3.4)
),但字符串的长度比数字灵活得多。(“上投射”和“下投射”数字规则非常简单。)

numpy不这样做的另一个原因是,它的重点是数值运算。
'A'**2
在python中没有特定的定义(您当然可以创建一个字符串类,但它应该是什么?)。字符串数组是numpy中的第二类公民。它们存在,但大多数操作都没有为它们定义

Python已经非常擅长处理字符串处理了

numpy不尝试提供字符串操作的另一个(实际上也是主要的)原因是python已经非常擅长于此

列表是非常灵活的容器。Python有大量非常好、非常快的字符串操作。列表理解和生成器表达式相当快,而且它们不需要因为猜测返回项的类型或大小而产生任何开销,因为它们不在乎(它们只存储指向它的指针)

此外,在python中迭代numpy数组要比在python中迭代列表或元组慢,但是对于字符串操作,最好只使用普通的列表/生成器表达式(例如,
print.'.'。join(Arr['strings']中的item的item.upper())
(在您的示例中)更好的是,首先不要使用numpy数组来存储字符串。如果您有一个带字符串的结构化数组的单列,这是有意义的,但仅此而已。Python为您提供了非常丰富和灵活的数据结构。numpy数组不是全部和最终的,它们是一种特殊情况,而不是一般情况

另外,请记住,使用numpy数组所要做的大部分工作

学习Python,而不仅仅是Numpy

我不想在这里厚颜无耻,但使用numpy数组与Matlab、R或IDL等中的许多东西非常相似

这是一个熟悉的范例,任何人的第一反应都是尝试将同样的范例应用到语言的其他部分

Python不仅仅是numpy。它是一种多范式语言,因此很容易坚持你已经习惯的范式。试着学习“用Python思考”以及“用numpy思考”.Numpy为python提供了一个特定的范例,但还有很多范例,有些范例比其他范例更适合某些任务

其中一部分是熟悉不同数据容器(列表、dicts、元组等)的优缺点,以及不同的编程范式(如面向对象、功能性、过程性等)

总而言之,python有几种不同类型的专用数据结构。这使得它与特定领域的语言(如R或Matlab)有所不同,后者有几种类型的数据结构,但专注于用一种特定的结构完成所有工作。(我对R的经验是有限的,所以我可能错了,但这是我对它的印象,a
print '.'.join(item.upper() for item in Arr['strings'])
>>> y = np.asarray("B-PER O O B-LOC I-LOC O B-ORG".split())
>>> y
array(['B-PER', 'O', 'O', 'B-LOC', 'I-LOC', 'O', 'B-ORG'], 
      dtype='|S5')
>>> np.char.startswith(y, 'B')
array([ True, False, False,  True, False, False,  True], dtype=bool)