用scipy表示稀疏矩阵

时间:2015-05-16 10:33:56

标签: python numpy matrix scipy sparse-matrix

我使用public class MainActivity extends Activity { public static final int UPDATE_TEXT = 1; private EditText etx1; private EditText etx2; private TextView result; Button getresult; private double num1; private double num2; private double resultnum; private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_TEXT: new Thread(new Runnable() { public void run() { String url = "http://localhost:8080/test/index.jsp?num1=" + num1 + "&" + "num2=" + num2; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); try { httpClient.execute(httpGet); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); result.setText(new Double(resultnum).toString()); break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etx1 = (EditText) findViewById(R.id.num1); etx2 = (EditText) findViewById(R.id.num2); result = (TextView) findViewById(R.id.result); getresult = (Button) findViewById(R.id.btn); View.OnClickListener buttonHandler= new View.OnClickListener() { public void onClick(View v) { num1 = Double.parseDouble(etx1.getText().toString()); num2 = Double.parseDouble(etx2.getText().toString()); resultnum = num1 + num2; new Thread(new Runnable() { public void run() { Message message = new Message(); message.what = UPDATE_TEXT; handler.sendMessage(message); } }).start(); } }; getresult.setOnClickListener(buttonHandler); } } 构建了scipy稀疏矩阵S。矩阵sklearn.preprocessing.OneHotEncoder()有10 ^ 6行,500列。

我还有一个S数组numpy,其中包含10 ^ 6个值,如下所示:

A

我希望在数组A = [1,1,2,2,2,3,4,5,6,6,7,8,8,8,...] 中编写的组之后的稀疏矩阵S上执行分组,并使用A作为聚合函数。

我该怎么办?当然,我的一切都需要适应内存,所以我被迫使用稀疏矩阵numpy.sum()

1 个答案:

答案 0 :(得分:2)

如果索引正在增加(似乎来自您的示例),则可以在列表的itertools.groupby上使用enumerate。对于每个组,请使用numpy's indexing

循环可能如下所示:

import itertools
import operator

for g, inds in itertools.groupby(enumerate(A), key=operator.itemgetter(1)):
    ...

并且...应该替换为使用S执行任何操作的代码。要了解原因,请注意以下示例:

for g, inds in itertools.groupby(enumerate(A), key=operator.itemgetter(1)):
     print g, list([i[0] for i in inds])

产生

1 [0, 1]
2 [2, 3, 4]
3 [5]
4 [6]
5 [7]
6 [8, 9]
7 [10]
8 [11, 12, 13]

您可以告诉第一项是该组,第二项是索引列表。 Numpy拥有广泛的实用工具来切片和放大给出这样的清单索引。