graphlab.SArray
<span style="font-size:18px;"> class graphlab.SArray(data=list(), dtype=None, ignore_cast_failure=False)</span>
一个不可变的,元素同类型的数组对象,支持长期存储。
SArray 可以处理远大于机器主内存的数据。它可以完善地支持数据缺失和随机存储。使用SArray格式的数据存储在和GraphLab Server进程同一台机器上。SFrame的每一列都是一个SArray。
参数:
data : list | numpy.ndarray | pandas.Series | string
输入的数据。如果是一个list, numpy.ndarray, 或 pandas.Series, 列表中的数据被转换并存储在一个SArray里面。或者,如果此参数是一个string,它会被解读为一个指向文本文件的路径(或url)。文本文件中的每一行都会被加载为表格中独立的行。如果data变量的值是一个指向保存了SArray的目录,它会直接从此目录中读出SArray。
dtype : {None, int, float, str, list, array.array, dict, datetime.datetime, graphlab.Image}, 可选参数
SArray的数据格式。如果没有被指定(None),我们会从输入数据中推断它。如它是numpy array或Pandas series,dtype参数会被设为array/series。如果它是一个list, dtype参数会被设为内置的list。如果data是一个指向文本文件的路径或者URL,dtype参数会被设定为str。
ignore_cast_failure : bool, 可选参数
如果设定为True,当元素不能匹配指定的dtype格式的时候,警告,但忽略匹配错误。
注意:
如果数据是pandas.Series,索引(index)会被忽略
datetime 以Boost datetime 格式为基础。[更多详细信息]
示例:
SArray可以使用多种方式构造。
从list构造Sarray
<span style="font-size:18px;">>>> from graphlab import SArray
>>> sa = SArray(data=[1,2,3,4,5], dtype=int)</span>
从numpy.ndarray构造SArray
<span style="font-size:18px;"> >>> sa = SArray(data=numpy.asarray([1,2,3,4,5]), dtype=int)
或:
>>> sa = SArray(numpy.asarray([1,2,3,4,5]), int)</span>
从pandas.Series构造Sarray
<span style="font-size:18px;">>>> sa = SArray(data=pd.Series([1,2,3,4,5]), dtype=int)
or:
>>> sa = SArray(pd.Series([1,2,3,4,5]), int)</span>
如果数据类型没有指定,会尝试自动识别。
<span style="font-size:18px;"> >>> SArray(data=[1,2,3,4,5]).dtype()
int
>>> SArray(data=[1,2,3,4,5.0]).dtype()
float</span>
SArray支持标准数据格式:int,float和str。同时支持三种高级数据格式: float arrays, dict and list(数组内元素格式不固定)。
从元素为string的list中创建SArray 。
<span style="font-size:18px;">>>> sa = SArray(data=['a','b'])</span>
从元素为float array的list中创建SArray 。
<span style="font-size:18px;">>>> sa = SArray([[1,2,3], [3,4,5]])</span>
从元素为list的list中创建SArray 。
<span style="font-size:18px;">>>> sa = SArray(data=[['a', 1, {'work': 3}], [2, 2.0]])</span>
从元素为dict的list中创建SArray 。
<span style="font-size:18px;">>>> sa = SArray(data=[{'a':1, 'b': 2}, {'b':2, 'c': 1}])</span>
从元素为datatime对象的list中创建SArray 。
<span style="font-size:18px;"> >>> sa = SArray(data=[datetime.datetime(2011, 10, 20, 9, 30, 10)])</span>
从本地文本文件中创建SArray (仅对本地服务器有效)
>>> sa = SArray('/tmp/a_to_z.txt.gz')
从URL下载文本文件建立SArray 。
>>> sa = SArray('http://s3-us-west-2.amazonaws.com/testdatasets/a_to_z.txt.gz')
数值运算
对于数值型数据,SArray支持大量的向量化运算。例如:
>>> sa = SArray([1,1,1,1,1])
>>> sb = SArray([2,2,2,2,2])
>>> sc = sa + sb
>>> sc
dtype: int
Rows: 5
[3, 3, 3, 3, 3]
>>> sc + 2
dtype: int
Rows: 5
[5, 5, 5, 5, 5]
支持所有数值运算(+,-,*,/),比较运算(>,>=,<,<=),以及逻辑运算符(&,|)。
例如:
>>> sa = SArray([1,2,3,4,5])
>>> (sa >= 2) & (sa <= 4)
dtype: int
Rows: 5
[0, 1, 1, 1, 0]
数据运算对数组型亦有效。
>>> sa = SArray(data=[[1.0,1.0], [2.0,2.0]])
>>> sa + 1
dtype: list
Rows: 2
[array('f', [2.0, 2.0]), array('f', [3.0, 3.0])]
>>> sa + sa
dtype: list
Rows: 2
[array('f', [2.0, 2.0]), array('f', [4.0, 4.0])]
加法运算符(+)也可以进行字符串拼接
>>> sa = SArray(data=['a','b'])
>>> sa + "x"
dtype: str
Rows: 2
['ax', 'bx']
将存储为string类的list和dictionary进行解释的时候,这个方法十分有效。
>>> sa = SArray(data=['a,b','c,d'])
>>> ("[" + sa + "]").astype(list) # adding brackets make it look like a list
dtype: list
Rows: 2
[['a', 'b'], ['c', 'd']]
支持所有的比较运算和布尔型操作,并返回一个二进制SArray。
>>> sa = SArray([1,2,3,4,5])
>>> sa >= 2
dtype: int
Rows: 3
[0, 1, 1, 1, 1]
>>> (sa >= 2) & (sa <= 4)
dtype: int
Rows: 3
[0, 1, 1, 1, 0]
可以像一个常规的python list一样,使用整数关键词来访问SArray或者进行切片操作。但是在一个较大的数据集上进行此操作可能会较慢,因此应当避免在SArray上使用循环访问。
>>> sa = SArray([1,2,3,4,5])
>>> sa[0]
1
>>> sa[2]
3
>>> sa[5]
IndexError: SFrame index out of range
可以使用导航,从数组的末尾来访问元素。
>>> sa[-1] # returns the last element
5
>>> sa[-2] # returns the second to last element
4
Sarray支持所有Python切片操作。
>>> sa[1000:] # Returns an SArray containing rows 1000 to the end
>>> sa[:1000] # Returns an SArray containing rows 0 to row 999 inclusive
>>> sa[0:1000:2] # Returns an SArray containing rows 0 to row 1000 in steps of 2
>>> sa[-100:] # Returns an SArray containing last 100 rows
>>> sa[-100:len(sa):2] # Returns an SArray containing last 100 rows in steps of 2
逻辑滤波器
SArray可以这样进行滤波
>>> array[binary_filter]
array和binary_filter是同样长度的SArray,返回的结果是一个包含‘array’中对应行的binary_filter为非零的元素的新SArray。
此运算允许使用布尔运算来进行逻辑滤波运算。例如:
>>> sa = SArray([1,2,3,4,5])
>>> sa[(sa >= 2) & (sa <= 4)]
dtype: int
Rows: 3
[2, 3, 4]
此运算亦可提供更广泛的滤波运算,否则用简单的布尔函数很难表达。例如:
>>> sa = SArray([1,2,3,4,5])
>>> sa[sa.apply(lambda x: math.log(x) <= 1)]
dtype: int
Rows: 3
[1, 2]
等价于
>>> sa.filter(lambda x: math.log(x) <= 1)
dtype: int
Rows: 3
[1, 2]
迭代
SArray可迭代处理,但是可能不够高效。因为它涉及到一个从服务器到客户端的流式传输;对于大数据处理,这应当被避免。
>>> sa = SArray([1,2,3,4,5])
>>> [i + 1 for i in sa]
[2, 3, 4, 5, 6]
可以用来将SArray转换为list类。
>>> sa = SArray([1,2,3,4,5])
>>> l = list(sa)
>>> l
[1, 2, 3, 4, 5]