Skip to content
Back to skills

Python Bio Numpy

ASecurity

NumPy for bioinformatics — vectorized operations, broadcasting for expression matrices, PWM construction, sliding-window GC with cumsum, and normalization recipes

  • 4 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 27, 2026
data-aipythonexpress

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add Pavel-Kravchenko/Bioinformatics --skill python-bio-numpy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Python Bio Numpy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Python Bio Numpy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/pavel-kravchenko-python-bio-numpy/badge)](https://www.skillsdirectory.com/skills/pavel-kravchenko-python-bio-numpy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: python-bio-numpy
description: NumPy for bioinformatics — vectorized operations, broadcasting for expression matrices, PWM construction, sliding-window GC with cumsum, and normalization recipes
tool_type: python
primary_tool: NumPy
---

# NumPy for Bioinformatics

## Key Concepts

- **Vectorized operations** run in compiled C — `arr * 2` is much faster than `[x * 2 for x in arr]`.
- **Broadcasting aligns from the right.** `(4,3) - (3,)` works (broadcasts across rows). `(4,3) - (4,)` fails — reshape to `(4,1)` first.
- **Views vs copies:** `arr[2:5]` is a view (modifies original). `arr[[0,2,4]]` and `arr[arr > 0]` return copies.
- **`axis` in aggregations:** `axis=0` collapses rows (per-column stats); `axis=1` collapses columns (per-row stats). In genes x samples: `axis=0` = per-sample, `axis=1` = per-gene.

## Bio Recipes

### RPKM Normalization

```python
def compute_rpkm(counts, lengths):
    rpm = counts * (1_000_000 / np.sum(counts))
    return rpm * (1_000 / lengths)
```

### CPM via Broadcasting

```python
expr = np.array([[120, 135, 128], [45, 50, 48], [300, 280, 310]], dtype=float)
sample_totals = expr.sum(axis=0, keepdims=True)   # shape (1, 3)
cpm = expr / sample_totals * 1_000_000
```

### Z-score Per Gene (row) Across Samples

```python
gene_means = expr.mean(axis=1, keepdims=True)
gene_stds  = expr.std(axis=1, keepdims=True)
z_scores = (expr - gene_means) / gene_stds
```

### Position Weight Matrix (PWM)

```python
def build_pwm(sequences):
    """Build PWM from aligned sequences. Returns (4, seq_len) frequency matrix."""
    mapping = {'A': 0, 'T': 1, 'G': 2, 'C': 3}
    seq_len = len(sequences[0])
    counts = np.zeros((4, seq_len))
    for seq in sequences:
        for i, nuc in enumerate(seq):
            counts[mapping[nuc], i] += 1
    return counts / len(sequences)

def score_sequence(pwm, sequence):
    """Score sequence against PWM (sum of log-odds vs uniform background)."""
    mapping = {'A': 0, 'T': 1, 'G': 2, 'C': 3}
    return sum(np.log2(pwm[mapping[nuc], i] / 0.25) if pwm[mapping[nuc], i] > 0 else -10
               for i, nuc in enumerate(sequence))
```

### Sliding Window GC with Cumulative Sum (O(n))

```python
def sliding_gc(sequence, window=50):
    """O(n) sliding window GC content using cumsum trick."""
    gc_binary = np.array([1 if n in 'GC' else 0 for n in sequence])
    cumsum = np.insert(np.cumsum(gc_binary), 0, 0)
    window_sums = cumsum[window:] - cumsum[:-window]
    return window_sums / window * 100
```

### Log-transform Expression Counts

```python
log_counts = np.log2(counts + 1)  # +1 pseudocount to avoid log(0)
```

### Correlation Between Gene Profiles

```python
corr = np.corrcoef(gene_a, gene_b)[0, 1]  # Pearson r
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.